【问题标题】:Android Capturing an image From Camera Returns Empty Data [duplicate]Android从相机捕获图像返回空数据[重复]
【发布时间】: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 上进行测试,但我在其他设备上也遇到了同样的问题

标签: android permissions android-camera-intent


【解决方案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>

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

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2013-01-22
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多