Android共享意图-某些文件不会共享

时间:2018-07-24 20:23:44

标签: java c# android xamarin xamarin.android

我在使用Android共享时遇到了一些问题。我能够成功共享图像文件(jpg,png,gifs),但是当我尝试共享任何其他文件(doc,docx,xl​​sx,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)。任何帮助将不胜感激。

1 个答案:

答案 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。