首页 > 解决方案 > 如何使用文件提供程序从内部存储图片目录中打开图库中的图像

问题描述

我正在开发一个应用程序,在该应用程序中,我将图像保存在内部存储中的图片目录中,并且在保存图像后,我正在显示一个使用文件提供程序在图库中查看图像的按钮,但问题是每当我单击打开图像按钮时它显示带有感叹号的灰色。这是我的代码:

MainActivity.kt

fun openDownloadImage(){

        var fileName  = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString() +"/${Environment.DIRECTORY_PICTURES}/MY_FOLDER_NAME/" +File(newUri).name


        var newFilePath = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) , fileName)


        var uri: Uri = GenericFileProvider.getUriForFile(this, "com.mypackage.name.provider", newFilePath)


        val resInfoList: List<ResolveInfo> = this.getPackageManager()
            .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
        for (resolveInfo in resInfoList) {
            val packageName: String = resolveInfo.activityInfo.packageName
            this.grantUriPermission(
                packageName,
                uri,
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
            )
        }

        val intent = Intent(Intent.ACTION_VIEW)

        intent.setDataAndType(uri, "image/*")

        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION;

        val resolvedInfoActivities: List<ResolveInfo> = packageManager.queryIntentActivities(
            intent,
            PackageManager.MATCH_DEFAULT_ONLY
        )
        for (ri in resolvedInfoActivities) {
            this.grantUriPermission(
                ri.activityInfo.packageName,
                uri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION
            )
        }
        startActivity(intent)
    } 

清单.xml

提供者标签 b/w 应用程序标签

<provider
            android:name=".GenericFileProvider"
            android:authorities="com.mypackage.name.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="internal storage" path="." />
</paths>

单击按钮后在图库中显示的图像

单击按钮后在图库中显示的图像

以及 logcat 中的画廊错误

2020-03-23 17:42:33.315 32228-32270/? E/Gallery: [2897/QuickViewNavigatorCo] loadThumbnailAsSync : null bitmap MediaItem{i,-1,-1,0,UriItem (0,0,0,0:0,0,image/jpeg:0,0:false:null:-909788947) ,GfoY2/imIVudOKYhWXimIVu4piFdOKXjzov4piFL2lu4pePLuKYhWHimIVr4piFc+KYhWjil49h4pePeeKYhXJh4piFbuKYhWEu4piFbWXil49t4pePZXMu4pePcOKXj3LimIVv4pePdmlk4pePZXIv4pePaeKYhW504piFZeKXj3Lil49u4piFYeKXj2wl4pePMuKXjzBzdG9y4piFYeKYhWfil49l4pePL1BpY+KYhXR14pePcuKYhWXil49z4pePL01l4pePbWVzKELimIVl4piFc+KXj3Til49fTeKYhWXimIVt4pePZXMpL07il49h4piFQ+KXj3fil4834piFOGxj4pePSOKYhUbil4924piFTOKXj3F64pePUeKYhVDil49L4piFU+KXj0TimIVt4pePLuKYhWril49wZw==7qOSC8R}
2020-03-23 17:42:33.591 32228-32262/? E/Gallery: [2930/         BeamManager] BeamManager : setBeamUris > can't load nfcadapter
2020-03-23 17:42:33.724 32228-32228/? E/Gallery: [2946/ImageViewerPresenter] preloadThumbnail item is broken
2020-03-23 17:42:33.727 32228-32228/? E/Gallery: [2952/ ImageViewerFragment] display rect is null or tag view is null
2020-03-23 17:42:33.769 32228-32228/? E/Gallery: [2973/ ImageViewerFragment] display rect is null or tag view is null


标签: androidkotlinandroid-imageviewandroid-storage

解决方案


推荐阅读