![](/img/trans.png)
[英]How to get file path of shared storage folder in Android 10 and above?
[英]How to get path /storage/emulated/0/Download/file_name.mime_type for Android 10 and above
我正在設備(Android 11)
的Downloads
目錄中保存一個文件,以便我的應用稍后查看。 我允許使用多種文件類型,如pdf
、 word
等。我能夠像這樣保存文件:(我從這里得到了這個代碼示例)
@TargetApi(29)
private suspend fun downloadQ(
url: String,
filename: String,
mimeType: String
) =
withContext(Dispatchers.IO) {
val response = ok.newCall(Request.Builder().url(url).build()).execute()
if (response.isSuccessful) {
val values = ContentValues().apply {
put(MediaStore.Downloads.DISPLAY_NAME, filename)
put(MediaStore.Downloads.MIME_TYPE, mimeType)
put(MediaStore.Downloads.IS_PENDING, 1)
}
val resolver = context.contentResolver
val uri =
resolver.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values)
uri?.let {
resolver.openOutputStream(uri)?.use { outputStream ->
val sink = outputStream.sink().buffer()
response.body()?.source()?.let { sink.writeAll(it) }
sink.close()
}
values.clear()
values.put(MediaStore.Downloads.IS_PENDING, 0)
resolver.update(uri, values, null, null)
} ?: throw RuntimeException("MediaStore failed for some reason")
} else {
throw RuntimeException("OkHttp failed for some reason")
}
}
但是當我試圖檢索文件時,我嘗試了以下不起作用的方法:
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Downloads._ID)
val id = cursor.getLong(idColumn)
Log.d("uri id ","$id")
val contentUri = ContentUris.withAppendedId(MediaStore.Downloads.EXTERNAL_CONTENT_URI,id)
這種方法引發了異常:
java.lang.IllegalArgumentException:找不到包含 /external/downloads/78 的已配置根目錄
我從query
中得到了這個ID
(這里是 78),從ContentResolver.query()
中得到了cursor
,我希望它返回我可以從中獲取文件的Uri
。
第二種方法是這樣的:
val uri = MediaStore.Downloads.getContentUri("external",id)
uri.path?.let { filePath ->
Log.d("uri path ",filePath)
val file = File(filePath)
} ?: Log.d("uri path ","null")
我根據這個答案使用external
作為目錄,但是這種方法也拋出了同樣的異常
java.lang.IllegalArgumentException:找不到包含 /external/downloads/78 的已配置根目錄
在我使用文件資源管理器應用程序查看確切的目錄路徑后,最終的工作是硬編碼這樣的東西:
val file = File("storage/emulated/0/Download/$name.$extension")
所以我的問題是,我如何動態地獲取這條路徑的值,這條路徑對於所有可以這樣使用的設備來說都是一樣的嗎?
編輯:我還想知道我是否使用filename
及其extension
來查看文件,那么如果用戶下載另一個具有相同名稱的文件,那么我如何確保打開正確的文件? (即使我在Download
中為我的應用程序創建了一個單獨的目錄,用戶仍然可以下載同一個文件兩次,其名稱類似於storage/emulated/0/Download/myDir/file(2).extension
)
試試下面的代碼,它會幫助你。
private fun readFile(){
val FILENAME = "user_details.txt"
val dir = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
.toString() + "/" + "folderName"
)
} else {
File(
Environment.getExternalStorageDirectory()
.toString() + "/${Environment.DIRECTORY_DOWNLOADS}/" + "folderName"
)
}
dir.apply {
if(this.exists()) File(this, FILENAME).apply {
FileInputStream(this).apply {
val stringBuffer = StringBuffer()
var i: Int
while (this.read().also { i = it } != -1) {
stringBuffer.append(i.toChar())
}
close()
}
}
}
}
您可以使用
{Environment.DIRECTORY_DOWNLOADS} + "/folderName/file_name.mime_type"
/存儲/模擬/0/下載/12d82c65-00a5-4c0a-85bc-238c28005c33.bin
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.