【发布时间】:2017-02-15 15:02:20
【问题描述】:
我想在第三方应用程序中编辑我的 Xamarin.Forms Android 应用程序的内部存储中的文件,例如在 PDF 文件中填写表单元素或编辑 .docx 文件。
通过我的实现,文件可以在外部应用程序中正确打开,但在某些应用程序中它是以只读方式打开的。 Adobe Acrobat 和 Microsoft Word 以只读方式打开文件,而其他应用程序(如 Google Docs)能够写回文件。 (我正在使用具有有效 Office365 订阅的 Microsoft Word)。
我在 AndroidManifest.xml 中的 FileProvider:
<provider android:name="android.support.v4.content.FileProvider"
android:authorities="xamarintestapp.xamarintestapp.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
文件路径.xml:
<paths>
<files-path name="files" path="."/>
</paths>
通过 Xamarin.Forms DependencyService 我正在启动一个 Activity 并传递内容 uri 以启动外部应用程序:
public void OpenFile(string fileName)
{
string auth = "xamarintestapp.xamarintestapp.fileprovider";
string mimeType = Android.Webkit.MimeTypeMap.Singleton.GetMimeTypeFromExtension(Android.Webkit.MimeTypeMap.GetFileExtensionFromUrl(fileName.ToLower()));
if (mimeType == null)
mimeType = "*/*";
var file = new Java.IO.File(Path.Combine(Forms.Context.FilesDir.Path, fileName));
Android.Net.Uri uri = FileProvider.GetUriForFile(Forms.Context, auth, file);
Intent intent = new Intent(Intent.ActionView);
intent.SetDataAndType(uri, mimeType);
intent.AddFlags(ActivityFlags.GrantReadUriPermission | ActivityFlags.GrantWriteUriPermission);
intent.AddFlags(ActivityFlags.NewTask | ActivityFlags.NoHistory);
// Trying to allow writing to the external app ...
var resInfoList = Forms.Context.PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
foreach (var resolveInfo in resInfoList)
{
var packageName = resolveInfo.ActivityInfo.PackageName;
Forms.Context.GrantUriPermission(packageName, uri, ActivityFlags.GrantWriteUriPermission | ActivityFlags.GrantPrefixUriPermission | ActivityFlags.GrantReadUriPermission);
}
Forms.Context.StartActivity(intent);
}
是我做错了什么还是这根本不可能?
【问题讨论】:
-
如果一个应用程序的行为符合预期,而两个则不是,那么您为什么认为您应该受到责备?尝试其他扩展程序和其他应用程序。在没有文件提供程序的情况下尝试这两个应用程序。
-
我已经在没有 FileProvider 的情况下尝试了这两个应用程序(将文件复制到外部存储并从那里打开它们 - 然后打开文件可写)。我也尝试了 ContentProvider 和 DocumentProvider ,结果相同,一些应用程序以只读方式打开文件,而另一些则没有,我很好奇为什么......
-
根据
Forms.Context.StartActivity(intent);之类的代码,您实际上是在开发 Xamarin.Forms 解决方案,而不是 Xamarin.Android,对吗?你的问题是关于 UWP 等其他平台上的写入权限,而不是 Android 平台上的? -
感谢您的回复,您是对的,我正在开发一个 Xamarin.Forms 应用程序,并通过 Xamarin.Forms DependencyService 在特定平台项目中实现 OpenFile 方法。我相应地更新了我的问题。我在 UWP 下的 OpenFile 实现可以工作,但我在 Android 下遇到了问题,还没有尝试过 iOS。
标签: android android-intent xamarin android-fileprovider