解决方案
因为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); } } }