2

我正在尝试 Android 开发。我正在制作一个允许用户浏览 Web 服务中的文件并查看它们的应用程序。这些文件可以是任何东西:文本、pdf、图片等。

以前,我会将文件下载到外部存储,然后调用Intent.SetDataAndType()并将 URL 传递给文件。这将导致 Android 设备调出应用选择器并让用户选择适当的方法来查看文件。

但由于我不想让用户编辑文件,只看它,下载文件到存储似乎很愚蠢;一个我不想闲逛的文件。既然文件可以通过 URL 获取,我为什么不把它作为参数传递给Intent.SetDataAndType()?

我试过了。第一个问题是文件名被假定为 Web 服务调用的名称,这似乎比 mime 类型更重要。我将 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"));,但这并没有给我更多的选择选择。

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

4

1 回答 1

1

我还没有找到一种方法来做到这一点,所以我经历了一个解决方法。

我没有使用 URL,而是将我的应用程序也更改为内容提供程序。现在,当我想要打开文件时,我会创建一个 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);

    }
}

这不是我最初的计划,但这种方式似乎效果很好并且满足了我的需求。

于 2013-10-09T18:55:41.123 回答