繁体   English   中英

使用 Glide 库从 OnActivityResult 检索的 Uri 时访问被拒绝

[英]Accessed denied when using Uri retrieved from OnActivityResult using Glide library

我已经使用标签 uses-permission 和 uses-permission-sdk-23 在 Android Manifest 下声明了 READ_EXTERNAL_STORAGE。 我还向用户请求了 READ_EXTERNAL_STORAGE 权限。 我还使用了标志 FLAG_GRANT_READ_URI_PERMISSION。

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
            photoPickerIntent.setType("image/*");
            photoPickerIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            if (photoPickerIntent.resolveActivity(getPackageManager()) != null) {
                startActivityForResult(photoPickerIntent, REQUEST_IMAGE_GALLERY);
            }

这就是我请求用户在 onActivityResult 中检索照片的方式。 我还使用 glide 库从用户那里检索照片。

requestMgr.load(new File(uri.getPath())).into(imageView);

这就是我检查从 onActivityResult 返回的意图是否为空后所写的内容。

 if(intent != null){
     Uri uri = intent.getData();
     requestMgr.load(new File(uri.getPath())).into(imageView);
 } else {
     displayImageStorageErrorMessage();
     loadProfileImage();
} 

loadProfileImage() 只是一个后备,以防我尝试加载图像时发生任何事情。 Glide.with() 是在检查意图之前编写的,因为我也会在用户想要自拍时使用它。

但是,imageView 不会显示用户选择的图像。 结果,在我将请求侦听器附加到 Glide 后,结果如下:

java.io.FileNotFoundException: open failed: EACCES (Permission denied)
        at android.os.ParcelFileDescriptor.openInternal(ParcelFileDescriptor.java:315)
        at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:220)
        at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1498)
        at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1420)
        at com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.java:20)
        at com.bumptech.glide.load.data.AssetFileDescriptorLocalUriFetcher.loadResource(AssetFileDescriptorLocalUriFetcher.java:11)
        at com.bumptech.glide.load.data.LocalUriFetcher.loadData(LocalUriFetcher.java:44)
        at com.bumptech.glide.load.engine.SourceGenerator.startNextLoad(SourceGenerator.java:70)
        at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:63)
        at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:310)
        at com.bumptech.glide.load.engine.DecodeJob.onDataFetcherFailed(DecodeJob.java:408)
        at com.bumptech.glide.load.engine.SourceGenerator.onLoadFailedInternal(SourceGenerator.java:160)
        at com.bumptech.glide.load.engine.SourceGenerator$1.onLoadFailed(SourceGenerator.java:83)
        at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:167)
        at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154)
        at com.bumptech.glide.load.data.LocalUriFetcher.loadData(LocalUriFetcher.java:49)
        at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
        at com.bumptech.glide.load.engine.SourceGenerator.startNextLoad(SourceGenerator.java:70)
        at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:63)
        at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:310)
        at com.bumptech.glide.load.engine.DecodeJob.onDataFetcherFailed(DecodeJob.java:408)
        at com.bumptech.glide.load.engine.SourceGenerator.onLoadFailedInternal(SourceGenerator.java:160)
        at com.bumptech.glide.load.engine.SourceGenerator$1.onLoadFailed(SourceGenerator.java:83)
        at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.startNextOrFail(MultiModelLoader.java:167)
        at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.onLoadFailed(MultiModelLoader.java:154)
        at com.bumptech.glide.load.data.LocalUriFetcher.loadData(LocalUriFetcher.java:49)
        at com.bumptech.glide.load.model.MultiModelLoader$MultiFetcher.loadData(MultiModelLoader.java:100)
        at com.bumptech.glide.load.engine.SourceGenerator.startNextLoad(SourceGenerator.java:70)
        at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:63)
        at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:310)
        at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279)
        at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:234)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
        at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:393)

关于我尚未完成的权限,我是否遗漏了什么?

问题 #1: ACTION_PICK不使用 MIME 类型

问题 2: ACTION_PICK确实使用了一个Uri指示您要从中挑选的集合,而您没有提供一个

问题 #3: ACTION_PICK可能会通过onActivityResult()返回一个content Uri ,而不是带有文件系统路径的东西

问题 4: setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)毫无意义,因为您没有向另一个应用程序提供content Uri ,更不用说您可以授予的读取权限的应用程序

要解决这些问题,请将您的第一个代码片段替换为以下内容:

        Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
        photoPickerIntent.setType("image/*");

        if (photoPickerIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(photoPickerIntent, REQUEST_IMAGE_GALLERY);
        }

用以下内容替换您的第二个代码片段:

if(intent != null){
     Uri uri = intent.getData();
     requestMgr.load(uri).into(imageView);
 } else {
     displayImageStorageErrorMessage();
     loadProfileImage();
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM