FileProvider正在打开PDF但它是空白的。为什么?

时间:2017-03-02 15:28:24

标签: android xamarin.android android-file android-fileprovider

我的应用中有一个FileProvider,它假装它正在工作,但它打开的文件是空白的。我已经确认该文件已经在指定目录中的设备上,并且不是空白,但是当我尝试从我的应用程序内部打开它时,它会失败。没有崩溃,也没有错误消息。有没有人见过这个?

FileProvider:

<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.my.redacted.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="external_storage" path="." />
</paths>

代码:

    var path = "/storage/emulated/0/MyApp/User/attachments/folder/attachment.pdf"
    var file = new Java.IO.File(path);
    var mime = MimeTypeMap.Singleton;
    var ext = MimeTypeMap.GetFileExtensionFromUrl(path).ToLower();
    var type = mime.GetMimeTypeFromExtension(ext);

    var intent = new Intent();
    intent.SetAction(Intent.ActionView);
    var name = activity.PackageName + ".provider";
    var uri = FileProvider.GetUriForFile(activity.ApplicationContext, name, file);
    intent.SetDataAndType(uri, type);
    intent.SetFlags(ActivityFlags.GrantReadUriPermission);
    intent.SetFlags(ActivityFlags.GrantWriteUriPermission);

    var packageManager = activity.PackageManager;
    if (intent.ResolveActivity(packageManager) != null)
        activity.RunOnUiThread(() => activity.StartActivity(intent));
    else
    {
        var message = "No viewer for attachments: " + type;
        activity.RunOnUiThread(() =>
            Snackbar.Make(view, message, Snackbar.LengthLong).Show()
        );
    }

我已经调试过,看看URI到底是什么,看起来是正确的:

uri.Path:

"/external_storage/MyApp/User/attachments/folder/attachment.pdf"

uri.ToString():

"content://com.my.redacted.provider/external_storage/MyApp/User/attachments/folder/attachment.pdf"

所以我真的不确定发生了什么。

注意:我的文档位于/ storage / emulated / 0 / MY_STUFF,我确实检查过这是<external-path>返回的内容。

2 个答案:

答案 0 :(得分:3)

我有同样的问题。没有pdf阅读器可以打开FileProvider提供的文件。

我的解决方案是添加标志GRANT_READ_URI_PERMISSION:

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

也许您的错误覆盖了代码中的FLAG_GRANT_READ_URI_PERMISSION

intent.setFlags(ActivityFlags.GrantReadUriPermission);
intent.setFlags(ActivityFlags.GrantWriteUriPermission); <- overrides the 1st flag

答案 1 :(得分:0)

文件资源管理器提供了一个文件系统路径。但现在你提供了一个内容方案路径。你觉得观众可以处理内容方案吗?尝试其他应用。