android Q 使用 ACTION_OPEN_DOCUMENT_TREE 選擇目錄進行遍歷文件夾下文件
- 前期準備-圖片選擇
- 獲取
我們都知道如何獲取圖片使用,使用如下代碼即可打開一個系統的圖片選擇器
然後在val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) intent.addCategory(Intent.CATEGORY_OPENABLE) intent.type = "image/*" startActivityForResult(intent, PICK_PIC_REQUEST_CODE)
onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
方法中使用val uri=data?.data
獲取到圖片到uri - 讀取
拿到圖片uri後通過以下代碼轉化爲bitmap對象(請注意如果選取到uri不是應用自身創建到文件,是需要讀寫權限的),拿到bitmap以後你就可以爲所欲爲了//通過流轉化成bitmap對象 val inputStream: InputStream? = contentResolver.openInputStream(uri) val bitmap= BitmapFactory.decodeStream(inputStream)
- 獲取
- 如何獲取文件夾
-
選擇文件夾
我們知道了如何選擇文件,那麼選擇文件夾呢?查找api可以發現android 爲我們提供一個Intent.ACTION_OPEN_DOCUMENT_TREE
字面意思就知道是選擇文件夾的,直接上代碼val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) startActivityForResult(intent, PICK_DIR_REQUEST_CODE)
-
獲取文件夾uri
同文件獲取一樣,在onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
方法中使用val uri=data?.data
獲取到文件夾uri,他可能長這樣content://com.android.providers.downloads.documents/tree/downloads
-
讀文件夾下內容
拿到文件夾的uri後就要進行遍歷了,這時需要了解另一個類 DocumentFile,下面一起看如何根據uri獲取文件夾下的文件,如有疑問請看註釋//獲取onActivityResult中獲取文件夾uri val uri = data?.data val listUri = mutableListOf<Uri>() uri?.let { //content://com.android.providers.downloads.documents/tree/downloads //基於文件夾uri構造DocumentFile, val documentFile = DocumentFile.fromTreeUri(this, it) //拿到文件夾下文件列表 val list= documentFile?.listFiles() //遍歷 list?.forEach { //文件名 it.name //文件類型 it.type //獲取文件夾下的圖片,並將圖片uri保存 if (it.isFile&&it.canRead()&& MimeType.isImage(it.type)) { listUri.add(it.uri) println("${it.uri} ${it.name} ${it.type} " ) } } } ``` * 拿到文件夾下uri列表以後怎麼操作,都很容易了.
-
最後提供一個常用的文件類型判斷類
enum class MimeType(val value: String) {
_png("image/png"),
_jpeg("image/jpeg"),
_jpg("image/jpeg"),
_webp("image/webp"),
_gif("image/gif"),
_bmp("image/bmp"),
_3gp("video/3gpp"),
_apk("application/vnd.android.package-archive"),
_asf("video/x-ms-asf"),
_avi("video/x-msvideo"),
_bin("application/octet-stream"),
_c("text/plain"),
_class("application/octet-stream"),
_conf("text/plain"),
_cpp("text/plain"),
_doc("application/msword"),
_docx("application/vnd.openxmlformats-officedocument.wordprocessingml.document"),
_xls("application/vnd.ms-excel"),
_xlsx("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"),
_exe("application/octet-stream"),
_gtar("application/x-gtar"),
_gz("application/x-gzip"),
_h("text/plain"),
_htm("text/html"),
_html("text/html"),
_jar("application/java-archive"),
_java("text/plain"),
_js("application/x-javascript"),
_log("text/plain"),
_m3u("audio/x-mpegurl"),
_m4a("audio/mp4a-latm"),
_m4b("audio/mp4a-latm"),
_m4p("audio/mp4a-latm"),
_m4u("video/vnd.mpegurl"),
_m4v("video/x-m4v"),
_mov("video/quicktime"),
_mp2("audio/x-mpeg"),
_mp3("audio/x-mpeg"),
_mp4("video/mp4"),
_mpc("application/vnd.mpohun.certificate"),
_mpe("video/mpeg"),
_mpeg("video/mpeg"),
_mpg("video/mpeg"),
_mpg4("video/mp4"),
_mpga("audio/mpeg"),
_msg("application/vnd.ms-outlook"),
_ogg("audio/ogg"),
_pdf("application/pdf"),
_pps("application/vnd.ms-powerpoint"),
_ppt("application/vnd.ms-powerpoint"),
_pptx("application/vnd.openxmlformats-officedocument.presentationml.presentation"),
_prop("text/plain"),
_rc("text/plain"),
_rmvb("audio/x-pn-realaudio"),
_rtf("application/rtf"),
_sh("text/plain"),
_tar("application/x-tar"),
_tgz("application/x-compressed"),
_txt("text/plain"),
_wav("audio/x-wav"),
_wma("audio/x-ms-wma"),
_wmv("audio/x-ms-wmv"),
_wps("application/vnd.ms-works"),
_xml("text/plain"),
_z("application/x-compress"),
_zip("application/x-zip-compressed"),
_0("*/*"),
;
companion object {
fun isImage(mimeType: String?): Boolean {
return mimeType?.let {
_webp.value == mimeType ||
_png.value == mimeType ||
_jpeg.value == mimeType ||
_jpg.value == mimeType ||
_bmp.value == mimeType ||
_gif.value == mimeType
} ?: false
}
fun isGif(mimeType: String?): Boolean {
return mimeType?.let {
_gif.value == mimeType
} ?: false
}
fun isApk(mimeType: String?) = mimeType?.let {
_apk.value == mimeType
} ?: false
fun isVideo(mimeType: String?) = mimeType?.let {
_m3u.value == mimeType || _avi.value == mimeType
} ?: false
}
}