我的问题和别人的情况不太一样,我权限,fileprovider,也提供了读写临时访问权限
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
仍然报错,百思不得其解,后来跟踪了一下发现拍照之后并没有生成图片文件,也就是说提供的文件路径无效,我用的是Environment.getExternalStorageDirectory()来获取文件路径的,这个方法在api 29之上是过时的因此我用了
context.getExternalCacheDir();//或者使用 context.getExternalFilesDir(Environment.DIRECTORY_ALARMS);
来设置文件路径发现可以正常裁剪。
或者试着在manifest中添加
在AndroidManifest.xml文件中application节点中加上android:requestLegacyExternalStorage="true"属性就可以了
例如
<application
android:requestLegacyExternalStorage="true"
在有些机型上即使上面都设置依然不能完成裁剪,跟踪一下发现还是权限的问题可添加一下代码
List<ResolveInfo> resInfoList = activity.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; activity.grantUriPermission(packageName, mCutUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); }
裁剪成功后,返回conent开头的uri 需要的可以转成file上传或者展示
/** * android7.0以上处理方法 */ private static String getFilePathForN(Context context, Uri uri) { try { Cursor returnCursor = context.getContentResolver().query(uri, null, null, null, null); int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); returnCursor.moveToFirst(); String name = (returnCursor.getString(nameIndex)); File file = new File(context.getFilesDir(), name); InputStream inputStream = context.getContentResolver().openInputStream(uri); FileOutputStream outputStream = new FileOutputStream(file); int read = 0; int maxBufferSize = 1 * 1024 * 1024; int bytesAvailable = inputStream.available(); int bufferSize = Math.min(bytesAvailable, maxBufferSize); final byte[] buffers = new byte[bufferSize]; while ((read = inputStream.read(buffers)) != -1) { outputStream.write(buffers, 0, read); } returnCursor.close(); inputStream.close(); outputStream.close(); return file.getPath(); } catch (Exception e) { e.printStackTrace(); } return null; }