Skip to content

Instantly share code, notes, and snippets.

@webserveis
Last active April 15, 2020 20:29
Show Gist options
  • Save webserveis/0effe0957c41a19ccced3a208f486ee4 to your computer and use it in GitHub Desktop.
Save webserveis/0effe0957c41a19ccced3a208f486ee4 to your computer and use it in GitHub Desktop.
Storage Acces Android Kotlin

Abrir selector de archivos

private val PICK_FILE_REQUEST_CODE = 0x100
...
fun openFilePicker() {
   val intent = Intent(Intent.ACTION_GET_CONTENT)
   intent.type = "*/*"
   //intent.type = "text/plain"
   //intent.type = "text/html"
   //intent.type = "image/*"
   //intent.type = "image/jpeg"
   //intent.type = "image/png"
   //intent.type = "audio/*"
   //intent.type = "audio/mpeg"
   //intent.type = "audio/ogg"
   //intent.type = "video/*"
   //intent.type = "video/mp4"
   //intent.type = "application/pdf"
   //intent.type = "application/octet-stream"   
   startActivityForResult(Intent.createChooser(intent, "Choose File"), PICK_FILE_REQUEST_CODE)
}

Su uso llamar openFilePicker() Los datos se reciben en onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == PICK_FILE_REQUEST_CODE && resultCode == RESULT_OK) {
        val selectedFile = data?.data //The uri with the location of the file

        Log.d(TAG, "onActivityResult: selectedFile= [$selectedFile]")
        
        processURI(selectedFile)
    }

Al seleccionar un documento/imagen etc.. se recibe algo asi content://com.android.providers.downloads.documents/document/7562

   fun processURI(uri: Uri) {
       Log.i(TAG, "$uri")
       if (uri.scheme.equals("content")) {
           if (!DocumentsContract.isDocumentUri(this, uri)) return

           val cursor: Cursor? = contentResolver.query(uri, null, null, null, null)
           cursor.use { c ->
               if (c != null && c.moveToFirst()) {


                   val fileUID = c.getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_DOCUMENT_ID)
                   val fileMineType = c.getString(c.getColumnIndex(DocumentsContract.Document.COLUMN_MIME_TYPE))
                   val displayName = c.getString(c.getColumnIndex(OpenableColumns.DISPLAY_NAME))
                   //val fileFSummary = c.getString(c.getColumnIndex(DocumentsContract.Document.COLUMN_SUMMARY))
                   val fileSize = c.getLong(c.getColumnIndex(OpenableColumns.SIZE))
                   val fileDateModified = Date(c.getLong(c.getColumnIndex(DocumentsContract.Document.COLUMN_LAST_MODIFIED)))
                   //val fileIcon = c.getString(c.getColumnIndex(DocumentsContract.Document.COLUMN_ICON))
                   val fileFlags = c.getInt(c.getColumnIndex(DocumentsContract.Document.COLUMN_FLAGS))

                   Log.d(TAG, "fileUID: $fileUID ")
                   Log.d(TAG, "fileMineType: $fileMineType ")
                   Log.d(TAG, "displayName: $displayName ")
                   //Log.d(TAG, "fileFSummary: $fileFSummary ")
                   Log.d(TAG, "fileSize: $fileSize ")
                   Log.d(TAG, "fileDateModified: $fileDateModified ")
                   //Log.d(TAG, "fileIcon: $fileIcon ")
                   Log.d(TAG, "fileFlags: $fileFlags ")

                   //https://developer.android.com/reference/android/provider/DocumentsContract.Document
                   if (fileFlags and DocumentsContract.Document.FLAG_SUPPORTS_DELETE != 0) {
                       Log.d(TAG, "FLAG_SUPPORTS_DELETE")
                   }

                   if (fileFlags and DocumentsContract.Document.FLAG_SUPPORTS_MOVE != 0) {
                       Log.d(TAG, "FLAG_SUPPORTS_MOVE")
                   }

                   if (fileFlags and DocumentsContract.Document.FLAG_SUPPORTS_WRITE != 0) {
                       Log.d(TAG, "FLAG_SUPPORTS_WRITE")
                   }

                   //val extension = File(displayName).extension
                   //Log.d(TAG, "extension: $extension")

                   val baseName: String = if (displayName.contains(".")) {
                       displayName.substring(0, displayName.lastIndexOf('.'))
                   } else displayName

                   Log.d(TAG, "baseName: $baseName")

                   val extension: String? = if (displayName.contains(".")) {
                       displayName.substring(displayName.lastIndexOf("."))
                   } else null
                   Log.d(TAG, "extension: $extension")

                   /*Log.d(TAG, "uri.authority: " + uri.authority)
                   Log.d(TAG, "uri.host: " + uri.host)
                   Log.d(TAG, "uri.path: " + uri.path)
                   Log.d(TAG, "uri.query: " + uri.query)
                   Log.d(TAG, "uri.scheme: " + uri.scheme)*/


               }
           }
       }
   }
   ```




### Debug de las columnas de un content provider
```kotlin
    fun debugContentProvider(uri: Uri) {
      Log.i(TAG,"uri= $uri"
      val cursor: Cursor? = contentResolver.query(uri, null, null, null, null)

       cursor.use { c ->
           if (c != null && c.moveToFirst()) {
               c.columnNames.forEach {
                   Log.d(TAG, "columnName: $it")
               }
           }
       }
       cursor?.close()
   }

Nombres de las columnas

Archivo obtenido de la galeria de un Tableta Samsung

D/MainActivity: columnNames: _id
D/MainActivity: columnNames: _data
D/MainActivity: columnNames: _size
D/MainActivity: columnNames: _display_name
D/MainActivity: columnNames: mime_type
D/MainActivity: columnNames: title
D/MainActivity: columnNames: date_added
D/MainActivity: columnNames: date_modified
D/MainActivity: columnNames: description
D/MainActivity: columnNames: picasa_id
D/MainActivity: columnNames: isprivate
D/MainActivity: columnNames: latitude
D/MainActivity: columnNames: longitude
D/MainActivity: columnNames: datetaken
D/MainActivity: columnNames: orientation
D/MainActivity: columnNames: mini_thumb_magic
D/MainActivity: columnNames: bucket_id
D/MainActivity: columnNames: bucket_display_name
D/MainActivity: columnNames: width
D/MainActivity: columnNames: height
D/MainActivity: columnNames: group_id
D/MainActivity: columnNames: spherical_mosaic
D/MainActivity: columnNames: addr
D/MainActivity: columnNames: langagecode
D/MainActivity: columnNames: is_secretbox
D/MainActivity: columnNames: weather_ID
D/MainActivity: columnNames: sef_file_type
D/MainActivity: columnNames: reusable
D/MainActivity: columnNames: is_drm
D/MainActivity: columnNames: is_favorite
D/MainActivity: columnNames: sef_file_sub_type
D/MainActivity: columnNames: smartcrop_rect
D/MainActivity: columnNames: is_hide
D/MainActivity: columnNames: cloud_server_id

Obteniendo un video de una Tableta Samsung

Uri content://media/external/video/media/1751

D/MainActivity: columnNames: _id
D/MainActivity: columnNames: _data
D/MainActivity: columnNames: _display_name
D/MainActivity: columnNames: _size
D/MainActivity: columnNames: mime_type
D/MainActivity: columnNames: date_added
D/MainActivity: columnNames: date_modified
D/MainActivity: columnNames: title
D/MainActivity: columnNames: duration
D/MainActivity: columnNames: artist
D/MainActivity: columnNames: album
D/MainActivity: columnNames: resolution
D/MainActivity: columnNames: description
D/MainActivity: columnNames: isprivate
D/MainActivity: columnNames: tags
D/MainActivity: columnNames: category
D/MainActivity: columnNames: language
D/MainActivity: columnNames: mini_thumb_data
D/MainActivity: columnNames: latitude
D/MainActivity: columnNames: longitude
D/MainActivity: columnNames: datetaken
D/MainActivity: columnNames: mini_thumb_magic
D/MainActivity: columnNames: bucket_id
D/MainActivity: columnNames: bucket_display_name
D/MainActivity: columnNames: bookmark
D/MainActivity: columnNames: width
D/MainActivity: columnNames: height
D/MainActivity: columnNames: resumePos
D/MainActivity: columnNames: isPlayed
D/MainActivity: columnNames: addr
D/MainActivity: columnNames: langagecode
D/MainActivity: columnNames: is_secretbox
D/MainActivity: columnNames: weather_ID
D/MainActivity: columnNames: is_360_video
D/MainActivity: columnNames: recordingtype
D/MainActivity: columnNames: recording_mode
D/MainActivity: columnNames: type3dvideo
D/MainActivity: columnNames: is_drm
D/MainActivity: columnNames: is_favorite
D/MainActivity: columnNames: video_view_mode
D/MainActivity: columnNames: video_codec_info
D/MainActivity: columnNames: audio_codec_info
D/MainActivity: columnNames: is_hide
D/MainActivity: columnNames: cloud_server_id
D/MainActivity: columnNames: is_hdr10_video

Obteniendo un mp3 de una tableta Samsung uri content://media/external/audio/media/14

D/MainActivity: columnNames: _id
D/MainActivity: columnNames: _data
D/MainActivity: columnNames: _display_name
D/MainActivity: columnNames: _size
D/MainActivity: columnNames: mime_type
D/MainActivity: columnNames: date_added
D/MainActivity: columnNames: is_drm
D/MainActivity: columnNames: date_modified
D/MainActivity: columnNames: title
D/MainActivity: columnNames: title_key
D/MainActivity: columnNames: duration
D/MainActivity: columnNames: artist_id
D/MainActivity: columnNames: composer
D/MainActivity: columnNames: album_id
D/MainActivity: columnNames: track
D/MainActivity: columnNames: year
D/MainActivity: columnNames: is_ringtone
D/MainActivity: columnNames: is_music
D/MainActivity: columnNames: is_alarm
D/MainActivity: columnNames: is_notification
D/MainActivity: columnNames: is_podcast
D/MainActivity: columnNames: bookmark
D/MainActivity: columnNames: album_artist
D/MainActivity: columnNames: is_sound
D/MainActivity: columnNames: year_name
D/MainActivity: columnNames: genre_name
D/MainActivity: columnNames: recently_played
D/MainActivity: columnNames: most_played
D/MainActivity: columnNames: recently_added_remove_flag
D/MainActivity: columnNames: is_favorite
D/MainActivity: columnNames: bucket_id
D/MainActivity: columnNames: bucket_display_name
D/MainActivity: columnNames: title_search_key
D/MainActivity: columnNames: title_pinyin
D/MainActivity: columnNames: composer_pinyin
D/MainActivity: columnNames: genre_name_pinyin
D/MainActivity: columnNames: _display_name_pinyin
D/MainActivity: columnNames: bucket_display_name_pinyin
D/MainActivity: columnNames: recordingtype
D/MainActivity: columnNames: latitude
D/MainActivity: columnNames: longitude
D/MainActivity: columnNames: addr
D/MainActivity: columnNames: langagecode
D/MainActivity: columnNames: is_secretbox
D/MainActivity: columnNames: is_memo
D/MainActivity: columnNames: label_id
D/MainActivity: columnNames: weather_ID
D/MainActivity: columnNames: sampling_rate
D/MainActivity: columnNames: bit_depth
D/MainActivity: columnNames: recorded_number
D/MainActivity: columnNames: recording_mode
D/MainActivity: columnNames: is_ringtone_theme
D/MainActivity: columnNames: is_notification_theme
D/MainActivity: columnNames: is_alarm_theme
D/MainActivity: columnNames: datetaken
D/MainActivity: columnNames: artist_id:1
D/MainActivity: columnNames: artist_key
D/MainActivity: columnNames: artist
D/MainActivity: columnNames: album_id:1
D/MainActivity: columnNames: album_key
D/MainActivity: columnNames: album

Recursos

https://stackoverflow.com/questions/19513556/select-multiple-files-with-intent-action-get-content https://github.com/androidbuffer/Kotlinfilepicker/blob/master/kotlinfilepicker/src/main/java/com/androidbuffer/kotlinfilepicker/KotUtil.kt https://stackoverflow.com/questions/18590514/loading-all-the-images-from-gallery-into-the-application-in-android https://www.grokkingandroid.com/android-tutorial-content-provider-basics/ https://stackoverflow.com/questions/18590514/loading-all-the-images-from-gallery-into-the-application-in-android

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment