android Q 使用 ACTION_OPEN_DOCUMENT_TREE 選擇目錄進行遍歷文件夾下文件

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
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章