Generalidades

Almacenamiento de alcance: procesamiento de archivos todo en uno con MediaStore | Via Lakshyasukhralia | Septiembre de 2021

Festival de Laba

Si su aplicación apunta a Android 11, ya no podrá escribir archivos en ningún lugar del sistema de archivos. Por lo tanto, su aplicación necesita una nueva forma de manejar el almacenamiento de medios.

Hemos examinado muchos artículos que describen un método para almacenar archivos multimedia, pero cada artículo tiene una implementación diferente para almacenar archivos de diferentes tipos de mime, como Mediastore para imágenes, DownlaodManager para videos y Pdfs / SAF de Docs, etc.

Aunque hay varias formas de manejar el almacenamiento, queremos poder manejar la mayor cantidad de tipos de archivos bajo la misma implementación.Ingresar Tienda de medios interfaz.

Una generaciónnorte En nuestro caso, usamos Firebase para descargar medios de la web y almacenarlos en un directorio público que ya existe en el sistema de archivos de Android, como FOTOS, AUDIO, DOCUMENTOS, etc. De esta manera, incluso si se desinstala la aplicación, nuestros archivos permanecerán.

Verifique los permisos existentes y pregunte si son necesarios.No lo necesitamos en SDK ≥ 29

private var readPermissionGranted = false
private var writePermissionGranted = false

fun updateOrRequestPermissionsactivity: Activity,
storagePermissionType: Int? = null
: Boolean val hasReadPermission, hasWritePermission, minSdk29= checkExistingStoragePermissionactivity

readPermissionGranted = hasReadPermission
writePermissionGranted = hasWritePermission

fun checkExistingStoragePermissionactivity: Activity: TripleBoolean, Boolean, Booleanval hasReadPermission = ContextCompat.checkSelfPermissionactivity,
Manifest.permission.== PackageManager.val hasWritePermission = ContextCompat.checkSelfPermissionactivity,
Manifest.permission.== PackageManager.val minSdk29 = Build.VERSION.>= Build.VERSION_CODES.return TriplehasReadPermission, hasWritePermission, minSdk29

private fun requestStoragePermissionsactivity: Activity, storagePermissionType: Int

ActivityCompat.requestPermissionsactivity,
Manifest.permission.,
storagePermissionType

Ayuda a describir los tipos MIME desde la extensión de archivo

enum class FileTypeval ext: String, val mimeType: String"jpg", "image/*",
"jpeg", "image/*",
"png", "image/*",
"webp", "image/*",
"tiff", "image/*",
"tif", "image/*",
"gif", "image/*",
"mp4", "video/*",
"avi", "video/*",
"mp3", "audio/*",
"pdf", "application/pdf",

Una clase de datos que contiene toda la información necesaria para escribirla en el sistema de archivos posteriormente.

data class FileWriteModelvar url: String,
val fileName: String,
val collection: Uri,
val mime: String

Obtenga el nombre del archivo de Firebase y configure su tipo MIME y la colección a la que pertenece y escríbalo en el sistema de archivos.

fun downloadFireBaseFilescontext: Context,
url: String,
callback: FirebaseDownloadCallback?,
firebaseFilePath: String
val fileName = getFileNameurl, firebaseFilePathval mime, collection= getFilePropertiesfileNameval fileWriteModel = FileWriteModelurl, fileName, collection, mimewriteToFileSystemcontext, callback, fileWriteModel

Obtenga los atributos de archivo de los diferentes tipos de archivos que se utilizarán en la llamada al método anterior

private fun getFilePropertiesurl: String
: PairString, Urireturn when