我正在尝试Android开发。我正在创建一个应用程序,允许用户浏览Web服务中的文件并查看它们。这些文件可以是任何文件:文本,PDF格式,图片等。
以前,我会将文件下载到外部存储,然后调用Intent.SetDataAndType()
并将URL传递给该文件。这将导致Android设备调出应用程序选择器,并让用户选择适当的方法来查看该文件。
但是由于我不希望用户编辑文件,只是为了查看它,将文件下载到存储器似乎很愚蠢;一个我不想闲逛的文件。由于文件可以通过URL获取,为什么我不将其作为参数传递给Intent.SetDataAndType()
?
我试过了。第一个问题是假定文件名是Web服务调用的名称,这似乎比mime类型更重要。我将Web服务更改为与尝试下载的文件同名。这解决了这个问题。
现在,该文件正在打开。但它始终在Web浏览器中打开。我选择了网络浏览器,但我宁愿让另一个应用程序打开它。
我的代码如下所示:
Intent i = new Intent(Intent.ActionView);
i.SetDataAndType(Android.Net.Uri.Parse(GetUrlToFile(fileref, fileName)), mimeType);
i.SetFlags(ActivityFlags.GrantReadUriPermission);
i.SetFlags(ActivityFlags.NewTask);
i.SetFlags(ActivityFlags.ClearWhenTaskReset); // so if the app is relaunched, we don't show the display application.
StartActivity(i);
代码在C#中,因为我使用的是Xamarin,但我认为不应该有所作为。
我尝试使用StartActivity(Intent.CreateChooser(i, "Open me"));
,但这并没有给我任何选择的选项。
有没有人对如何做到这一点有任何想法?
答案 0 :(得分:1)
我还没有办法做到这一点,所以我已经解决了。
我没有使用网址,而是将我的应用更改为内容提供商。现在,当我想要打开文件时,我创建一个URI,引用我的应用程序中的文件并将其传递给Intent。当我的应用程序与此Intent联系时,我将本地文件下载到我的缓存目录并返回该文件。
我的代码已更改为:
Intent i = new Intent(Intent.ActionView);
i.SetDataAndType(Android.Net.Uri.Parse("content://com.sample.erik.provider/files/" + id), mimeType);
i.SetFlags(ActivityFlags.GrantReadUriPermission);
i.SetFlags(ActivityFlags.NewTask);
i.SetFlags(ActivityFlags.ClearWhenTaskReset); // so if the app is relaunched, we don't show the display application.
StartActivity(i);
然后,我有自己的内容提供商,负责完成OpenFile()
public override ParcelFileDescriptor OpenFile(Android.Net.Uri uri, string mode)
{
switch (sUriMatcher.Match(uri))
{
case FILE_ID:
if (mode != "r")
throw new Java.Lang.UnsupportedOperationException("Do not support write access: " + uri);
String id = uri.LastPathSegment;
Java.IO.File file = new Java.IO.File(Application.Context.CacheDir, id);
DownloadToFile(file, id);
return ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly);
default:
throw new Java.Lang.IllegalArgumentException("Unknown Uri: " + uri);
}
}
这不是我原来的计划,但这种方式看起来效果很好并且满足了我的需求。