在不使用浏览器的情况下在Android中打开文件的URL

时间:2013-10-03 23:13:20

标签: android xamarin

我正在尝试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"));,但这并没有给我任何选择的选项。

有没有人对如何做到这一点有任何想法?

1 个答案:

答案 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);

    }
}

这不是我原来的计划,但这种方式看起来效果很好并且满足了我的需求。