2015-11-06 38 views
0

我有這樣的代碼:如何獲得任何類型的文件與intent.createChooser安卓

protected void pickFile(View view){ 

    ///Codigo que abre la galeria de imagenes y carga la imagen en displayedImage 

    Intent intent = new Intent(); 
    intent.setType("file/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Choose File to Upload"), 1); 

} 

//It's executed when leaving file system 
@Override 
protected void onActivityResult(int reqCode, int resCode, Intent data){ 
    super.onActivityResult(reqCode, resCode, data); 

    if (reqCode == 1 && resCode == RESULT_OK && data != null) { 
     Uri selectedFile = data.getData(); 
     RequestMaker.uploadFile(this, selectedFile, "this is a file"); 
    } 
} 

我想要做的是能夠選擇從我的手機的任何文件,並將其發送。

該代碼起作用,它打開選擇器並讓我搜索任何文件。然而,我有幾個問題:

  • 當我嘗試通過「內部存儲」選項訪問,我不能選擇任何項目。他們都是殘疾人士。我修復了安裝一個文件管理器,它可以讓我選擇我想要的文件,但也許有一個快速修復。
  • 當我選擇文件並運行Uri.getPath()時,有時路徑是有效的,其他人和一般情況下,當我選擇一些圖像文件時,我得到的路徑有一個錯誤。不是真正的。 我看到一些在線修補程序,但它們都是從圖像中選擇圖像,我想要一般圖像。

我該如何解決這個問題?

回答

1

代碼工作

不,不。

首先,file/*不是有效的MIME類型,或者甚至是通配符MIME類型。 There is no MIME type that begins with file/。如果您想要任何MIME類型,請嘗試*/*

二,ACTION_GET_CONTENT不允許用戶「選擇任何文件」。它允許用戶從實現ACTION_GET_CONTENT活動的設備上的任何應用中挑選一段內容,該活動選擇遵守您的MIME類型。該活動返回的是Uri,指向內容。這不必是一個本地文件,更不用說一個你有直接文件系統訪問權限的文件了。

當我選擇文件並運行Uri.getPath(),有時路徑有效

沒有,路徑總是有效(至少暫時的)。這只是你的想法而已。 A Uri is not a file

例如,大概您正在Web瀏覽器中查看此網頁。如果您在Web瀏覽器的地址欄看,你會看到下面的網址:

https://stackoverflow.com/questions/33575449/how-to-get-any-type-of-file-with-intent-createchooser-android 

通過你的思維方式,這指的是一個文件,您的硬盤驅動器,位於/questions/33575449/how-to-get-any-type-of-file-with-intent-createchooser-android上。

情況並非如此。部分URL表示路徑相關的位置;在這種情況下,它指的是一個Web服務器。

A Uri是一樣的東西。特別是,如果Uri的方案不是file:,則Uri只是一個地址,不一定映射到任何可以直接獲取的地址。正如Web瀏覽器開發人員使用HTTP獲取關於此網頁內容的流,因此您必須使用ContentResolveropenInputStream()來獲取content:Uri值的內容。

我該如何解決這個問題?

或者:

  • 使用UriUri,與openInputStream()getType(),並在ContentResolver類似的方法,或

  • 不要使用ACTION_GET_CONTENT,而是建立自己的自己的用戶界面來瀏覽你的應用碰巧能夠到達的文件。這將成爲設備上所有文件的子集,因爲並非所有內容都位於應用有權訪問的位置(例如,可移動媒體上的文件將被忽略)。但是,它將您的代碼與您的心智模型同步(即,您需要文件,而不是內容)。

相關問題