Android从相机捕获图像返回空数据[重复]

Posted

技术标签:

【中文标题】Android从相机捕获图像返回空数据[重复]【英文标题】:Android Capturing an image From Camera Returns Empty Data [duplicate] 【发布时间】:2019-04-06 09:46:42 【问题描述】:

android 应用 Intent 中捕获图像时,每次都返回 null。请参阅下面我正在使用的代码。我尝试了多种方法来获得许可和意图集,但仍然无法获取数据。

相机动作

 private void takePhotoFromCamera() 

    if(ActivityCompat.checkSelfPermission(ObservationsView.this, 
    Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)
    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    File file = new File(getExternalCacheDir(),
                String.valueOf(System.currentTimeMillis()) + ".jpg");fileUri = Uri.fromFile(file);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    cameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivityForResult(cameraIntent, CAMERA_REQUEST);
    else 
    String[] permissionRequest = Manifest.permission.CAMERA;
    requestPermissions(permissionRequest, 8675309);
    checkPermission();
    

这是响应代码

   protected void onActivityResult(int requestCode, int resultCode, Intent data) 

    if(resultCode == RESULT_OK ) 
        Uri selectedImg = null;
        Bitmap bmp = null;
        Bundle extras;
        if (requestCode == CAMERA_REQUEST) 
            selectedImg = data.getData();
            extras = data.getExtras();

            bmp = (Bitmap) extras.get("data");

        

        else if (requestCode == CAMERA_REQUEST) 

            selectedImg = fileUri;


            // Bitmap mphoto = (Bitmap) data.getExtras().get("data");
            try 
                bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), fileUri);
                if (bmp != null) 
                    bmp = getBitmapFromUri(fileUri);
                
            catch (IOException e) 
                e.printStackTrace();
            

            Uri tempUri = getImageUri(getApplicationContext(), bmp);


            Intent passPhoto = new Intent(this, Photo.class);
            passPhoto.putExtra("image",tempUri);

            passPhoto.putExtra("Caller", getIntent().getComponent().getClassName());
            startActivity(passPhoto);


        

【问题讨论】:

你是如何从相机onActivityResult结果中获取数据的? 您不需要返回的Intent 数据。图片位于fileUri。你可以从那里得到它。 目标版本是什么?您是否在某些平台或任何地方都面临这个问题? 您不需要CAMERA 权限即可使用默认相机拍摄 @SalmanKhan 我正在三星 S5 和 Android 6.0 上进行测试,但我在其他设备上也遇到了同样的问题 【参考方案1】:

尝试使用以下代码在所有 API 中获取图像 -

 public void takePicture() 
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            file = FileProvider.getUriForFile(mContext,
                    BuildConfig.APPLICATION_ID + ".provider",
                    getOutputMediaFile());
            intent.putExtra(MediaStore.EXTRA_OUTPUT, file);
            startActivityForResult(intent, TAKE_IMAGE_REQUEST);
        

 private File getOutputMediaFile() 
        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), getString(R.string.app_folder_name));

        if (!mediaStorageDir.exists()) 
            if (!mediaStorageDir.mkdirs()) 
                return null;
            
        


        return new File(mediaStorageDir.getPath() + File.separator +
                PROFILE_PIC + getString(R.string.pic_type));
    

在你的 onActivityResult 上 -

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) 
            case TAKE_IMAGE_REQUEST:
                if (resultCode == RESULT_OK) 
                    imageView.setImageURI(file);
                
                break;

            default:
                break;

        
    

另外,您需要在 Manifest.xml 文件中定义提供程序 -

  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="$applicationId.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

最后provider_paths.xml将如下-

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

如果您需要任何说明,请告诉我。

【讨论】:

以上是关于Android从相机捕获图像返回空数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用android相机捕获图像后的空指针

从android中的画廊和相机中捕获图像

从相机捕获的图像被视为 ImageView 对象的问题。 - 安卓

在android中减小从相机捕获的图像的大小

从相机捕获图像并将其显示在android的另一个活动中

Android - 如何从相机捕获图像或从库中添加