[問題] 從content:// URI資源反查檔案位置

看板AndroidDev作者 (程式猿)時間12年前 (2013/02/23 17:28), 編輯推噓0(0017)
留言17則, 2人參與, 最新討論串1/1
我要讓使用者選擇檔案,方法是用Intent + ACTION_GET_CONTENT (chooser) 選擇檔案後回傳的資源可分為 content:/和 file:// URI 如果是file:// 格式,就把路徑抓出來即可,因為其實就是指向sdcard下的檔案 問題出在反查content:/ URI的時候,會得到奇怪的路徑: 1. 得到content URI:content://media/xxxx/<資源編號> 2. 反查該資源對應的路徑:/storage/sdcard0/Pictures/<檔案名稱> 3. 用File物件開啟檔案 ... 就掛了 請問 storage/sdcard0/Pictures/ 其實是裝置名稱而不是掛載目錄名稱嗎, 有別的方法可以拿到目錄名稱嗎,或是這樣的結果是正確的? --------------------------- content URI 反查路徑程式片段 ContentResolver res = getContentResolver(); Cursor c=res.query(uri, new String[]{"_data"}, null, null,null); int index = c.getColumnIndexOrThrow("_data"); c.moveToFirst(); path=c.getString(index); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.161.32.68

02/24 02:37, , 1F
我猜你1. 拿到的是 該筆資料在mediaprovider的 id
02/24 02:37, 1F

02/24 02:37, , 2F
也就是你的 "<資源編號>" 用這id去query
02/24 02:37, 2F

02/24 02:37, , 3F
mediaprovider 的 _data 欄位 的確會拿到檔案在
02/24 02:37, 3F

02/24 02:38, , 4F
本機上的位置 就我所知 應該所有media要去執行
02/24 02:38, 4F

02/24 02:39, , 5F
檔案(ex. mp3/video) 都是用這個欄位居多
02/24 02:39, 5F

02/24 02:40, , 6F
所以在 mediaScanner運行正常下 _data 這個欄位
02/24 02:40, 6F

02/24 02:41, , 7F
應該就是你要的檔案位置沒錯
02/24 02:41, 7F
應該說檔案實際位置是 /sdcard/Pictures/<檔案> 但是用URI查詢出來是 /storage/sdcard0/Pictures/<檔案> 導致File object找不到檔案

02/24 10:58, , 8F
權限?
02/24 10:58, 8F
有可能,雖然反查路徑成功,但是無法讀取... 不過這個路徑在DDMS看不到耶 雖然暫時可以自己硬改為正確的路徑啦 不過這可能不是正規做法 ※ 編輯: codemonkey 來自: 118.161.32.68 (02/24 13:35)

02/24 14:57, , 9F
但MediaScanner應該有handle權限的問題
02/24 14:57, 9F

02/24 14:58, , 10F
所以MediaProvider裡面應該只會放Current User可以
02/24 14:58, 10F

02/24 14:58, , 11F
讀取的檔案才對
02/24 14:58, 11F

02/24 14:59, , 12F
mnt/sdcard/ 會掛載到 /storage/sdcard + USERID
02/24 14:59, 12F

02/24 14:59, , 13F
記得是這樣 不過在DDMS裡面可以看到它是如何link
02/24 14:59, 13F

02/24 15:01, , 14F
就是了 有錯還請指正
02/24 15:01, 14F

02/24 15:02, , 15F
對了我記得有特定的資料夾可以讓 user共享檔案的樣子
02/24 15:02, 15F

02/24 15:03, , 16F
倒不如把你要執行的檔案放到那個資料夾
02/24 15:03, 16F

02/24 15:03, , 17F
或許可以驗證是不是 權限 的問題
02/24 15:03, 17F
文章代碼(AID): #1HAFmYDe (AndroidDev)