-1

由於android 6.0,sdcard路徑不再是「/ storage/sdcard1 /」,「/ storage/sdcard-ext /」之類的東西。在android 6.0中找不到sdcard文件(不是硬代碼)

路徑取決於電話。如果我使用Nexus 5x AVD,路徑爲「/ storage/1D15-3A1B /」。當我使用Nexus 6p AVD時,路徑爲「/ storage/4679-1802 /」。那麼我該如何在程序中動態地寫入sdcard路徑來查找外部sdcard中的文件呢?

謝謝!

+3

不是Environment.getExternalStorageDirectory()。getAbsolutePath();工作了? – Frame91

+3

@ Frame91是正確的。你永遠不應該使用任何這些路徑,它總是依靠電話。如果您使用的是在大多數設備上失敗的那些,那麼這些甚至不是6.0之前最常見的路徑。 –

+1

永遠不要依賴硬編碼路徑! –

回答

0

看一看getExternalFilesDirs()

+0

感謝您的回覆。我看着這個功能。但它仍然會返回到「模擬」路徑... –

+0

它將返回一組路徑。第二項是SD卡的路徑。它真的... FilesDirs不是... FilesDir。 – greenapps

+0

我剛讀過這個評論。是的,'getExternalFilesDirs()'更容易做到這一點......我誤以爲'getExternalFilesDir()'而不是! @greenapps –

0

看來我找到了解決方案。

我正在使用訪問存儲框架。我通過處理uri字符串得到它並獲得「1D15-3A1B」部分,然後將其組合到SD卡路徑。這是解決方案。

  1. 當我點擊SD卡的根路徑的文件Welcome to Word.docx,我得到intent通過onActivityResult()
  2. 獲得文檔編號String docId = DocumentsContract.getDocumentId(intent.getData()),因此字符串docId"1D15-3A1B:Welcome to Word.docx"
  3. 拆分字符串並按String[] split = docId.split(":")得到一個字符串數組,所以我們可以得到"1D15-3A1B"這是split[0],並且sdcard "Welcome to Word.docx"中的路徑是split[1]
  4. 如果我們想要得到我們之前點擊的文件的URI,只需要建立一個新的字符串String newPath = "/storage/" + split[0] + "/" + split[1]

更新: 其實getExternalFilesDirs()更容易做到這一點...謝謝@greenapps!

+0

請說明您的工作方式和做法。 – greenapps

+0

@greenapps sry我是新來的......我現在編輯解決方案。 –

+0

如果你在/ storage中使用文件瀏覽器查看,你會看到它。 – greenapps

0

我嘗試很多方法,包括:在DCIM /攝像機

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) 
Environment.getExternalStorageDirectory() 

不過我的圖片文件是不可見的,我的應用程序。我可以看到目錄名,但是這些目錄中的任何一個的listFiles()都返回null。 最後,怯懦地,我發現我的Manifest沒有包含魔術線android.permission.WRITE_EXTERNAL_STORAGE。 一旦我添加了權限,它就像一個魅力。

故事的道德:在這種情況下,Android不會警告/打破/拋出異常。當它失敗時,它會默默地失敗!

相關問題