首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android共享意图-某些文件不会共享

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

Stack Overflow用户
提问于 2018-07-25 04:23:44
回答 1查看 277关注 0票数 1

我有一些关于Android共享意图的问题。我能够成功地共享图像文件(jpg,png,gifs),但当我尝试共享任何其他文件(doc,docx,xlsx,ppt)时,我从应用程序中收到错误,告诉我打开文件时出错,但当我尝试从文件管理器打开它们时,它们工作正常。

代码语言:javascript
复制
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 )。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-25 04:56:04

您需要使用基于file方案的uri,而不仅仅是传递基于文件系统的路径。

注意:Downloads目录在安卓上是一个可公开访问的文件位置,因此不需要授予权限,也不需要内容提供商,但如果这些文件,文档|x或不是来自您的应用程序沙箱,那么您将需要实现一个内容提供商,并将content://-based提供商uri共享给Word、Excel和其他应用程序……

示例:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51506962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档