Android7.0拍照失败FileUriExposedException

Android 7.0[API24]以及以上版本不支持file://,使用content://URI

所以跳转到系统相机,并传Uri会报错.

解决办法:

一 , 更新获取Uri方法

 private void camera(Context context,String name) {
        if (new  PermissionUtils((Activity) context).needPermission(2)) {
            File path = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
            if(!path.exists()) {
                path.mkdirs();
            }
            String picName = name + System.currentTimeMillis() + ".jpg";
            File file = new File(path, picName);

            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            Uri imageUri ;
            if(Build.VERSION.SDK_INT>Build.VERSION_CODES.KITKAT){  // 测试时发现 当小于API19 时,用新的方法获取Uri时会报错.
                imageUri = FileProvider.getUriForFile(context,context.getPackageManager()+".FileProvider",file); // 新的获取Uri 的方法
            }else{ 
                imageUri = Uri.fromFile(file);
            }
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            if(cameraIntent.resolveActivity(context.getPackageManager()) != null){
                listener.onCamera(cameraIntent,file);
            }else{
                Toast.makeText(context, R.string.msg_no_camera, Toast.LENGTH_SHORT).show();
            }
        }
    }

二 , 在Res/xml下设置文件路径



        

path = "." ,该路径由启动拍照时写入Uri的路径决定,这里也可以写具体路径,但必须与拍照时写入的路径一样,否则会报错.

三 , 对FileProvider进行设置

 
            
  

四, 获取手机存储的媒体文件的Uri

在24之后,获取手机中的媒体文件的uri,老方法 Uri.fromFile(photoFile) 也会报错,所以只能转换成 content://

 /**
     * 获取内存中的媒体文件获取 content Uri
     * @param context
     * @param imageFile 原媒体文件
     * @return content Uri
     */
    public static Uri getImageContentUri(Context context, File imageFile) {
        String filePath = imageFile.getAbsolutePath();
        Cursor cursor = context.getContentResolver().query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                new String[] { MediaStore.Images.Media._ID },
                MediaStore.Images.Media.DATA + "=? ",
                new String[] { filePath }, null);

        if (cursor != null && cursor.moveToFirst()) {
            int id = cursor.getInt(cursor
                    .getColumnIndex(MediaStore.MediaColumns._ID));
            Uri baseUri = Uri.parse("content://media/external/images/media");
            return Uri.withAppendedPath(baseUri, "" + id);
        } else {
            if (imageFile.exists()) {
                ContentValues values = new ContentValues();
                values.put(MediaStore.Images.Media.DATA, filePath);
                return context.getContentResolver().insert(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            } else {
                return null;
            }
        }
    }

参考文献:
Android7.0拍照失败FileUriExposedException,你的拍照代码升级了吗
Android7.0适配之图片裁剪

你可能感兴趣的:(Android7.0拍照失败FileUriExposedException)