簡體   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