我有一些关于Android共享意图的问题。我能够成功地共享图像文件(jpg,png,gifs),但当我尝试共享任何其他文件(doc,docx,xlsx,ppt)时,我从应用程序中收到错误,告诉我打开文件时出错,但当我尝试从文件管理器打开它们时,它们工作正常。
var uri = Android.Net.Uri.Parse(System.IO.Path.Combine(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDownloads).AbsolutePath, 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(System.IO.Path.Combine(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDownloads).AbsolutePath, fileName));
Android.Net.Uri intentUri = null;
Intent intent = new Intent(Intent.ActionView);
intent.SetDataAndType(uri, mimeType);
intent.SetFlags(ActivityFlags.GrantReadUriPermission);
Forms.Context.StartActivity(Intent.CreateChooser(intent, "Choose an App"));
我试过检查MIME类型,它们似乎是文档和文档文件的正确(application/vnd.openxmlformats-officedocument.wordprocessingml.document )。任何帮助都将不胜感激。
发布于 2018-07-25 04:56:04
您需要使用基于file
方案的uri,而不仅仅是传递基于文件系统的路径。
注意:Downloads
目录在安卓上是一个可公开访问的文件位置,因此不需要授予权限,也不需要内容提供商,但如果这些文件,文档|x或不是来自您的应用程序沙箱,那么您将需要实现一个内容提供商,并将content://
-based提供商uri共享给Word、Excel和其他应用程序……
示例:
var fileName = "demo.docx";
var mimeType = MimeTypeMap.Singleton.GetMimeTypeFromExtension(MimeTypeMap.GetFileExtensionFromUrl(fileName)) ?? "*/*";
var downloads = Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDownloads);
using (var intent = new Intent(Intent.ActionView))
using (var uri = new Uri.Builder()
.Scheme("file")
.Authority("localhost")
.AppendEncodedPath(downloads.CanonicalPath)
.AppendEncodedPath(fileName)
.Build())
{
intent.SetDataAndType(uri, mimeType);
StartActivity(Intent.CreateChooser(intent, "Choose an App"));
}
更新:
通过ClipData.Item.getUri()超越app的
....exposed
比方说,针对Android / API -28进行编译,并在清单中使用minSDKVersion但没有targetSDKVersion (Xamarin称其为“自动”),此代码将会工作(我有使用以上代码运行的最新API的Android P应用程序,但它们在运行时不“针对”特定的API级别。)
但是你的目标是一个特定的API >= Nougat,因此你将不得不实现一个文件提供者来“共享”甚至公共文件,从而向你要共享的应用程序提供基于content://的uris。
https://stackoverflow.com/questions/51506962
复制相似问题