mediaStore.MediaColumns.DATAを使用して、ギャレーからすべての画像をアプリにロードしたいのですが、これは非推奨であるため、他の方法でロードしてください。私は今このコードを使用していますが、私が言ったように非推奨です
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
}
MediaStore.MediaColumns.Dataを独自のファイルID(信じられないことに、ファイルにはIDがあります)に置き換えて、次のようにそのURIを正しく構築することができました。
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
}
そしてUriを使用してビューで作成します!
私はなんとかして次の解決策を考え出しました、それは以前の answer へのその種の追加です
でも、取得したウリで画像を読み込めませんでした。 Documentation 私が行ったopenFileDescriptor()の使用を提案し、それから画像のビットマップをデコードしました:
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
}
追伸私のメソッドは後でアプリで使用するAdapterImageオブジェクトのリストを返しますが、この時点で必要なものを何でも置くことができます