天天看点

android.os.FileUriExposedException

解决方案

因为buildsdk是>=24,所以调用Uri.fromFile时保错,解决方法:

在application的onCreate里:
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure()

SDK>24 和<24的解决方案
public static void openFile(Context context, File file) {
        Intent intent = new Intent();
        intent.setAction(android.content.Intent.ACTION_VIEW);
        Uri uri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(context,
                    context.getApplicationContext().getPackageName() + ".provider",
                    file);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            uri = Uri.fromFile(file);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
        }
        context.startActivity(intent);
    }


<------------------------------分割线----------------------------->
*****************************************************************************
***为Android N调用相机时崩溃提供一种解决方法,亲测有效***
***其中 savePath 为临时保存的路径,tempFileName为拍照 ***
***后存储的照片名称。                                                           ***
************************************************************By JayGoo ***
*******************************************************************************
 /**
     * 从拍照获取图片
     */
    public void camera() {
        Intent intent = null;
        // 判断存储卡是否可以用,可用进行存储

        if (StorageUtils.hasSdcard()) {
            //设定拍照存放到自己指定的目录,可以先建好
            File file = new File(savePath);
            if(!file.exists()){
                file.mkdirs();
            }
            Uri pictureUri;
            File pictureFile = new File(savePath, tempFileName);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                ContentValues contentValues = new ContentValues(1);
                contentValues.put(MediaStore.Images.Media.DATA, pictureFile.getAbsolutePath());
                pictureUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);
            }else {
                intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                pictureUri = Uri.fromFile(pictureFile);
            }
            if (intent != null) {
                intent.putExtra(MediaStore.EXTRA_OUTPUT,
                        pictureUri);
                startActivityForResult(intent, 1);
            }
        }
    }