je veux charger toutes les photos de la cuisine sur mon application par usign MediaStore.MediaColumns.DATA mais c'est obsolète alors quelle est l'autre façon de les charger, merci. J'utilise ce code maintenant mais il est obsolète comme je l'ai dit
fun getAllShownImagesPath(activity: Activity): MutableList<String> {
val uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val cursor: Cursor?
val columnIndexData: Int
val listOfAllImages: MutableList<String> = mutableListOf()
val projection = arrayOf(MediaStore.MediaColumns.DATA)
var absolutePathOfImage: String
cursor = activity.contentResolver.query(uri, projection, null, null, null)
if (cursor != null) {
columnIndexData = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)
while (cursor.moveToNext()) {
absolutePathOfImage = cursor.getString(columnIndexData)
listOfAllImages.add(absolutePathOfImage)
}
cursor.close()
}
return listOfAllImages
}
J'ai pu remplacer MediaStore.MediaColumns.Data avec son propre ID de fichier (incroyablement, les fichiers ont des ID) et construire correctement son URI, comme ceci:
fun getAllShownImagesPath(activity: Activity): MutableList<Uri> {
val uriExternal: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val cursor: Cursor?
val columnIndexID: Int
val listOfAllImages: MutableList<Uri> = mutableListOf()
val projection = arrayOf(MediaStore.Images.Media._ID)
var imageId: Long
cursor = activity.contentResolver.query(uriExternal, projection, null, null, null)
if (cursor != null) {
columnIndexID = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (cursor.moveToNext()) {
imageId = cursor.getLong(columnIndexID)
val uriImage = Uri.withAppendedPath(uriExternal, "" + imageId)
listOfAllImages.add(uriImage)
}
cursor.close()
}
return listOfAllImages
}
puis avec Uri vous le construisez dans vos vues!
J'ai réussi à trouver la solution suivante, son genre d'ajout à la précédente réponse
mais là, je ne pouvais toujours pas charger d'images avec l'URI obtenu. Documentation a suggéré d'utiliser openFileDescriptor (), ce que j'ai fait puis en décodant les bitmaps des images:
override fun loadImagesFromStorage(): List<AdapterImage> {
val uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val cursor: Cursor?
val columnIndexId: Int
val listOfAllImages = mutableListOf<AdapterImage>()
val projection = arrayOf(MediaStore.Images.Media._ID)
cursor = context.contentResolver
.query( uri, projection, null, null, null)
if ( cursor != null ){
columnIndexId = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (cursor.moveToNext()){
val contentUri = ContentUris.withAppendedId(uri, cursor.getLong(columnIndexId))
//here I open FileDescriptor and then decode it into Bitmap
var image: Bitmap
context.contentResolver.openFileDescriptor(contentUri, "r").use { pfd ->
if( pfd != null ){
image = BitmapFactory.decodeFileDescriptor(pfd.fileDescriptor)
listOfAllImages.add(AdapterImage(image))
}
}
}
cursor.close()
}
return listOfAllImages
}
P.S. Ma méthode retournera une liste d'objets AdapterImage que j'utiliserai plus tard dans l'application, mais vous pouvez y mettre tout ce dont vous avez besoin à ce stade