FileProvider 正在打开一个 PDF,但它是空白的。为什么?
FileProvider is opening a PDF but it is blank. Why?
我的应用程序中有一个 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>
返回的内容。
文件资源管理器提供了一个文件系统路径。但是现在你为它提供了一个内容方案路径。您确定观众可以处理内容方案吗?尝试其他应用程序。
我遇到了同样的问题。没有 pdf reader 可以打开我从 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
我的应用程序中有一个 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>
返回的内容。
文件资源管理器提供了一个文件系统路径。但是现在你为它提供了一个内容方案路径。您确定观众可以处理内容方案吗?尝试其他应用程序。
我遇到了同样的问题。没有 pdf reader 可以打开我从 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