2017-04-04 563 views
2

我遇到了問題。我有Uri其內容是這樣的:Uri,com.android.externalstorage.documents位於非主捲上

content://com.android.externalstorage.documents/document/[volume_uuid]:[file_path] 

我能夠通過StorageManager.getStorageVolumes()

定位StorageVolume如果卷是主:StorageVolume.isPrimary() - 我知道我可以解析路徑:

Environment.getExternalStorageDirectory() + "/" + file_path; 

但是如何定位路徑如果音量不是主要的?最後,我需要通過它的絕對路徑引用普通的File對象。

P.S.當然,我確實擁有所有必要的權限:通過清單或運行時聲明都靜態聲明。

回答

2

我知道我可以解析路徑

不可靠。您假定代碼的特定內部實現可能因設備製造商和操作系統版本而異。

最後,我需要通過它的絕對路徑引用普通的File對象。

第1步:使用ContentResolveropenInputStream()獲得由Uri

第2步中標識的內容的InputStream:打開FileOutputStream到一些你控制文件(例如,在getCacheDir()

步驟#3:從InputStream內容複製到FileOutputStream

步驟#4:使用生成的文件,刪除它時,它是不再需要

爲了確保我有所有必要的許可

爲了確保你不會,因爲你沒有權限來訪問移動存儲文件,非常具體的地理位置(例如,第二個和後續路徑由getExternalFilesDirs()返回)。

+0

好吧,明白了。我可以用於相同的目的'DocumentFile'嗎? – barmaley

+0

@barmaley:'DocumentFile'本身並不執行任何這些步驟。另外,'DocumentFile'只能用於存儲訪問框架中的'Uri'值(例如'ACTION_OPEN_DOCUMENT'),而我不確定你從哪裏得到這個'Uri'。但是,歡迎您嘗試一下您認爲有幫助的事情。 – CommonsWare

+0

究竟 - 在我的情況我處理由'ACTION_OPEN_DOCUMENT'和'ACTION_OPEN_DOCUMENT_TREE' – barmaley