我在使用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类型,但它们似乎是正确的(doc和docx文件的application / vnd.openxmlformats-officedocument.wordprocessingml.document)。任何帮助将不胜感激。
答案 0 :(得分:1)
您需要使用基于file
的基于方案的uri,而不仅仅是传递基于文件系统的路径。
注意:Downloads
目录是Android上可公开访问的文件位置,因此不需要授予权限或内容提供商,但是如果这些文件(无论是否为doc | x)都来自应用程序的内部沙箱,那么您将需要实现内容提供程序并与Word,Excel和其他应用共享基于content://
的提供程序uri ...
示例:
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()暴露于应用程序之外
根据Android P / API-28进行编译,并使用清单中的minSDKVersion但清单中没有targetSDKVersion(Xamarin称其为“自动”),并且此代码可以正常工作(我有使用最新API的Android P应用,使用以上代码,但它们在运行时不会“定位”特定的API级别。)
但是您要针对特定的API> = Nougat,因此您将必须实现文件提供程序以“共享”甚至公共文件,从而向要共享的应用程序提供基于content://的uris。