android - 权限拒绝 : writing android. support.v4.content.FileProvider uri

标签 android android-intent crop android-7.0-nougat android-securityexception

美好的一天。我有一个奇怪的问题,堆栈溢出中的示例都没有解决。我正在打开一个画廊,之后我将用户重定向到裁剪 Intent 。重要的是要提到这只发生在 android N 而不是在设备下方。问题是一旦裁剪完成就会抛出此异常。我不知道是什么原因造成的,但实际上这是我开始裁剪 Intent 的方式。

 Intent cropIntent = new Intent("com.android.camera.action.CROP");
    cropIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);


    Uri outPutUri = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", new File(output));
    Uri photoURI = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", new File(path));

    activity.grantUriPermission("com.android.camera.action.CROP", outPutUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    activity.grantUriPermission("com.android.camera.action.CROP", photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

    cropIntent.setDataAndType(photoURI, "image/*");

    cropIntent.putExtra("crop", "true");

    cropIntent.putExtra("aspectX", aspectX);
    cropIntent.putExtra("aspectY", aspectY);


    cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, outPutUri);

    activity.startActivityForResult(cropIntent, CROP_REQUEST);

我已授予 Uri 权限,已将这些添加到 list 中

  <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>

我已经尝试了所有堆栈溢出答案示例,在这种情况下不再有堆栈溢出问题,而且没有任何一个有效。那么 android N 有什么问题?应该这么难吗?

这是抛出的异常

FATAL EXCEPTION: main
Process: com.android.gallery3d, PID: 5735
java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri content://my.package.name/external_files/Android/data/my.package.name/cache/0.5062300225583558.png from pid=5735, uid=10071 requires the provider be exported, or grantUriPermission()
at android.os.Parcel.readException(Parcel.java:1683)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:621)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1000)
at android.content.ContentResolver.openOutputStream(ContentResolver.java:742)
at android.content.ContentResolver.openOutputStream(ContentResolver.java:718)
at com.android.gallery3d.filtershow.crop.CropActivity$BitmapIOTask.<init>(CropActivity.java:408)
at com.android.gallery3d.filtershow.crop.CropActivity.startBitmapIO(CropActivity.java:339)
at com.android.gallery3d.filtershow.crop.CropActivity.startFinishOutput(CropActivity.java:311)
at com.android.gallery3d.filtershow.crop.CropActivity$1.onClick(CropActivity.java:117)
at android.view.View.performClick(View.java:5610)
at android.view.View$PerformClick.run(View.java:22260)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
09-30 13:19:44.376 11909-11942/volo.global.pingbing E/FA: Task exception on worker thread: java.lang.IncompatibleClassChangeError: The method 'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)' was expected to be of type virtual but instead was found to be of type direct (declaration of 'com.google.firebase.iid.zzg' appears in /data/app/volo.global.pingbing-1/base.apk): com.google.android.gms.measurement.internal.zzt.zzEd(Unknown Source)

最佳答案

List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            grantUriPermission(packageName, photoURI, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }

关于android - 权限拒绝 : writing android. support.v4.content.FileProvider uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39787129/

相关文章:

android - 如何在 Xamarin 中获取 Assets 文件路径?

android - 有没有更好的方法将上下文传递给辅助 kotlin 类?

java - 在 Android 中通过 Socket 发送 1 MB 数据缓冲区

android - 如何在 android 中播放我的 youtube 帐户中的视频

java - Eclipse 视频 Intent 视频

android - 多个 Intent 过滤器

swift - 如何在 Swift 中裁剪 UIImage 以 mask

java - 将其他应用程序的图像共享到我的应用程序

android - 具有 scaleType centerCrop 过渡的共享元素是跳跃的

FFmpeg 无法正确裁剪视频