Android 使用targetSdkVersion 25访问摄像头时出现问题?

Android 使用targetSdkVersion 25访问摄像头时出现问题?,android,target-sdk,Android,Target Sdk,我有一个使用摄像头的应用程序,当我使用targetSdkVersion 23编译它时,它可以正常工作,但当我尝试使用version 25时,我遇到以下错误: android.os.FileUrieExposedException: file:///storage/emulated/0/DCIM/IMG_1093948364.jpg 暴露在应用程序之外 通过ClipData.Item.getUri() 这是我正在使用的代码: private void showCameraAction() {

我有一个使用摄像头的应用程序,当我使用
targetSdkVersion 23
编译它时,它可以正常工作,但当我尝试使用
version 25
时,我遇到以下错误:

android.os.FileUrieExposedException: file:///storage/emulated/0/DCIM/IMG_1093948364.jpg 暴露在应用程序之外 通过ClipData.Item.getUri()

这是我正在使用的代码:

private void showCameraAction() {
    if(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED){
        requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
                getString(R.string.mis_permission_rationale_write_storage),
                REQUEST_STORAGE_WRITE_ACCESS_PERMISSION);
    }else {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
            try {
                mTmpFile = FileUtils.createTmpFile(getActivity());
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (mTmpFile != null && mTmpFile.exists()) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
                startActivityForResult(intent, REQUEST_CAMERA);
            } else {
                Toast.makeText(getActivity(), R.string.mis_error_image_not_exist, Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(getActivity(), R.string.mis_msg_no_camera, Toast.LENGTH_SHORT).show();
        }
    }
}

private void requestPermission(final String permission, String rationale, final int requestCode){
    if(shouldShowRequestPermissionRationale(permission)){
        new AlertDialog.Builder(getContext())
                .setTitle(R.string.mis_permission_dialog_title)
                .setMessage(rationale)
                .setPositiveButton(R.string.mis_permission_dialog_ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        requestPermissions(new String[]{permission}, requestCode);
                    }
                })
                .setNegativeButton(R.string.mis_permission_dialog_cancel, null)
                .create().show();
    }else{
        requestPermissions(new String[]{permission}, requestCode);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(requestCode == REQUEST_STORAGE_WRITE_ACCESS_PERMISSION){
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
            showCameraAction();
        }
    } else {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

我该怎么办?谢谢。

您的
FileUtils.createTmpFile(getActivity())
可能使用file://URI与其他应用程序共享文件(在您的示例中是照相机)

大于24的Android版本使用content://URI,当您尝试直接使用file://URI共享文件时,将引发此异常

内容URI允许您使用临时访问权限授予读写访问权限

看看。

解决方案:

更改为:

            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
为此:

            //getActivity() because its a fragment
            Uri uri = FileProvider.getUriForFile(getActivity(),
                    getActivity().getPackageName()
                    , mTmpFile);

            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

它成功了。

请检查此项,并将“请提供解决方案”作为问题的答案,而不是更新。这是为了帮助未来的游客,避免混淆。谢谢。下面几行我正在制作一个Uri(链接说这是问题所在),我试着这样写:
Uri Uri=FileProvider.getUriForFile(MultiImageSelectorFragment.this,MultiImageSelectorFragment.this.getApplicationContext().getPackageName()+“.provider”,mTmpFile)但我在
getApplicationContext()中遇到一个错误
,它无法解析方法“getApplicationContext()”。有没有想过如何修复它?