使用Intent.ACTION_VIEW显示来自FileProvider的照片

时间:2019-01-07 22:23:52

标签: java android android-studio android-intent android-fileprovider

我正在运行Android 8.1.0的设备上工作。我正在尝试从邮件附件中打开图像。一周前,我使用FileProvider缓存了一个图像文件,现在它停止工作了,而无需我触摸代码。我正在尝试将内部应用存储中的图像共享到应用外部的Intent.ACTION_VIEW。照片查看器确实会启动,但是有一个进度圈一直在旋转。有什么建议么?谢谢!

void launchViewer(File f) {
    Uri uri = FileProvider.getUriForFile(context, "com.company.secure.provider", f);
    Intent intent = new Intent(Intent.ACTION_VIEW);
    String mimeType =  Attachment.getMimeType(f.getName());
    //TODO Test to make sure this works on all devices...
    if (mimeType.startsWith("video")) {
        mimeType = "video/*";
    }

    if (mimeType.startsWith("image")) {
        mimeType = "image/*";
    }

    if(mimeType==null || mimeType.length()==0) {
        unknownMimeType(f.getName());
        return;
    }
    List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    if(resInfoList==null || resInfoList.size()==0)
    {
        AlertDialog dialog = new AlertDialog.Builder(context).setTitle("Error")
                .setMessage(String.format("Cannot find app to open file type(%s)",mimeType)).show();
        return;
    }
    for (ResolveInfo resolveInfo : resInfoList) {
        String packageName = resolveInfo.activityInfo.packageName;
        context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }
    intent.setDataAndType(uri, mimeType);
    context.startActivity(intent);
}

Stack Trace

1 个答案:

答案 0 :(得分:0)

因此,我只需要在开始活动之前添加以下行。

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

由于某种原因,我运往测试中的APK中没有包含此行的APK可以正常工作...但是如果没有此版本,任何新版本都无法正常工作。我读到,使用ResolveInfo方法仅适用于Lollipop及以下版本,您必须直接向该意图授予权限。 (不确定这是多么真实)。因此,我将两种权限授予方法都保留在那里,以覆盖所有基础。感谢您的所有帮助!