【问题标题】:android camera android.os.FileUriExposedException:android相机android.os.FileUriExposedException:
【发布时间】:2019-02-20 03:36:41
【问题描述】:

这是代码

public void openCamera() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File file = new File(Environment.getExternalStorageDirectory(), "image.jpg");
    imageURI = Uri.fromFile(file);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageURI);
    startActivityForResult(intent, CAMERA);
}

这是错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app.app, PID: 2971

: file:///storage/emulated/0/image.jpg exposed beyond app through ClipData.Item.getUri()
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1958)
        at android.net.Uri.checkFileUriExposed(Uri.java:2348)
        at android.content.ClipData.prepareToLeaveProcess(ClipData.java:941)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:9735)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:9720)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1609)
        at android.app.Activity.startActivityForResult(Activity.java:4472)
        at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:65)
        at android.app.Activity.startActivityForResult(Activity.java:4430)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:711)
        at com.kushy.features.sell.CommunityPostActivity.openCamera(CommunityPostActivity.java:414)
        at com.kushy.features.sell.CommunityPostActivity$11.onClick(CommunityPostActivity.java:388)
        at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:162)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

尝试过文件提供程序,但我不确定如何实现它。使代码无法运行。对不起...我很烂

【问题讨论】:

    标签: android camera


    【解决方案1】:

    使用此代码获取 Android N 或更高版本的 uri:

    private Uri getFileUri(Context context, Uri fileUri, File file) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file);
        } else {
            return fileUri;
        }
    }
    

    并且不要忘记添加带有意图的标志:

    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    

    【讨论】:

      【解决方案2】:

      如果您的 targetSdkVersion >= 24,则不能在 Android 7.0+ 设备上的 Intents 中使用 file: Uri 值。您可以像这样更改代码:

          Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
          ContentValues contentValues = new ContentValues(1);
          contentValues.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
          Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
          intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
          startActivityForResult(intent, CAMERA);
      

      更多详情:Android camera intent FileUriExposedException for SDK >= 24https://developer.android.com/training/secure-file-sharing/setup-sharing

      【讨论】:

      • 我替换了 public void openCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);文件 file = new File(Environment.getExternalStorageDirectory(), "image.jpg"); imageURI = Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageURI); startActivityForResult(intent, CAMERA); } 呢?
      猜你喜欢
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2013-01-06
      • 2015-10-27
      相关资源
      最近更新 更多