繁体   English   中英

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

[英]Open a url to a file in Android without using a browser

我正在尝试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")); 但这并没有给我更多选择的余地。

是否有人对如何执行此操作有任何想法?

我还没有找到执行此操作的方法,所以我经历了一个变通方法。

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

    }
}

这不是我最初的计划,但是这种方式似乎可以很好地满足我的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM