2015-09-15 59 views
0

我正在使用ACTION_GET_CONTENT,以便用戶可以選擇其餘代碼可以讀取和處理的文本文件。ACTION_GET_CONTENT給出錯誤的路徑

Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
intent.setType("text/*"); 
startActivityForResult(Intent.createChooser(intent, "select data"), SELECT_DATA); 

以上是我的代碼,以便用戶可以瀏覽哪些工作正常。

Uri DataUri = data.getData(); 
File FileUri = new File(DataUri.getPath()); 

如果我使用的getPath或getAbsolutePath後轉換DataUri或fileURI所爲字符串,我得到一個完全錯誤的道路。

路徑應該是/ storage/emulated/0/Documents/myFile,但是它給了我/ document/primary:Documents/myFile。我不知道這個「主要:文檔」是什麼。

意向本身的數據已經有錯誤的路徑,有什麼建議嗎?

+1

'路徑應該是...'是什麼讓你覺得呢?是什麼讓你覺得你收到的Uri代表一個文件對象?還有許多其他類型的資源可以由Uri代表。 – njzk2

回答

3

我使用ACTION_GET_CONTENT,使用戶可以選擇文本文件

不,你正在使用ACTION_GET_CONTENT,使用戶可以選擇具有MIME類型的text/*一些內容。內容來自哪裏主要取決於用戶。它可能是也可能不是文件系統上的文件,如果是,則可能是也可能不是您可以直接訪問的文件(例如,Dropbox應用程序的內部存儲空間,Android 4.4+設備上的可移動存儲上的文件)。

的路徑應該是/存儲/模擬/ 0 /文檔/ MYFILE

不,它不應該。

,但它給了我/文檔/主:文件/文件MyFile

你得到的將任何活動處理ACTION_GET_CONTENT要求有所不同。該活動的內容取決於用戶安裝的內容,支持ACTION_GET_CONTENT以及用戶從已安裝內容列表中選擇的內容。

通常情況下,你會得到一個contentUri(即getScheme()Uri將返回content),爲Uri將指向由ContentProvider所服務的數據。

從意圖本身的數據已經走錯了路

它具有正確的路徑。這根本不是文件系統上的路徑。

有什麼建議嗎?

使用ContentResolveropenInputStream()獲得由contentUri所代表的內容的InputStream

+0

我現在看到了。我沒有完全理解ACTION_GET_CONTENT,所以現在它更清晰一點。將使用BufferedReader reader = new BufferedReader(new InputStreamReader(getContentResolver()。openInputStream(DataUri)));'是否相同?它似乎還沒有工作。我將它作爲字符串傳遞到字符串數組中,使用Uri.parse(UriString)將其轉換回來,然後使用該Uri打開流。 – Marakalastic

+0

@Marakalastic:「會用...是完全相同的嗎?」 - 與什麼相同? 「我將它作爲一個字符串傳遞給一個字符串數組,然後使用Uri.parse(UriString)將其轉換回來,然後用該Uri打開一個流」 - 確保在所有相同的'Uri'你開始的Uri。另外,請記住,這些「Uri」值是短暫的。例如,您不能堅持使用它們,例如,計劃在您的應用下次運行時再次使用它們。將它們看作類似於需要會話cookie的Web服務器URL。 – CommonsWare

+0

我的意思與使用ContentResolver完全相同,但我意識到這是同樣的事情。是的,它是一樣的,只是在不同的方法中完成,但在同一個活動中完成。我知道Uri是一樣的,因爲在異常發生之前,我之後從陣列中打印了Uri。另外,我幾乎複製並粘貼了整個'getContentResolver'代碼。唯一的區別是我沒有將它從一個Uri改變成一個絃樂,而是後面。最初,我想將一堆路徑存儲在一個數組中,以便我可以逐個打開它們。我現在選擇將數據作爲字符串存儲在數組中。 – Marakalastic