近期在修改bug 发现一部红米4测试机的拍照返回异常 因为之前全部使用的使系统默认路径 在测试机上拍照成功后选择直接闪退 想了想 可能是因为有的系统禁止使用默认路径 也可能是返回bingder过大异常了 反正没想通 。。。。所以直接换成 保存指定路径了 然后在uri的获取方法上 加上一个判断就可以了
File file = new File(PathUtil.getFilepath("/js"), new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".jpg"); 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, file.getAbsolutePath()); cameraUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); } else { intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraUri = Uri.fromFile(file); }
if (intent != null) { intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); startActivityForResult(intent, RESULT_CAMERA_ACTIVITY); }
注意到这个错误 android.os.FileUriExposedException bugly的
解决方案
因为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); } } }