Загрузка списка фотографий из галерее

У меня приложение мессанжер и хочу добавить возможность загрузки фотографий, для этого решил сделать отдельную активность где я могу выбрать какие фотографии из галереи я хочу отправить(можно отметить несколько фото), в голове появилась мысль, загрузить лист ссылок на каждую фотографию в галереи в отображение их каждой с помощью Glide, но на этапе получение ссылки возникает ошибка

  Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=17396, uid=10118 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
    at android.os.Parcel.readException(Parcel.java:1954)

код из активности

 fun getCameraImages(context: Context): List<String> {
    val bucketId = "${Environment.getExternalStorageDirectory()}/DCIM/Camera ".toLowerCase().hashCode().toString()

    val projection =
        arrayOf(Images.Media.DATA)
    val selection = Images.Media.BUCKET_ID + " = ?"
    val selectionArgs = arrayOf<String>(bucketId)
    val cursor: Cursor = context.contentResolver.query(
        Images.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        selectionArgs,
        null
    )!!
    val result: ArrayList<String> = ArrayList(cursor.count)
    if (cursor.moveToFirst()) {
        val dataColumn: Int = cursor.getColumnIndexOrThrow(Images.Media.DATA)
        do {
            val data: String = cursor.getString(dataColumn)
            result.add(data)
        } while (cursor.moveToNext())
    }
    cursor.close()
    return result
}

так же я прошу

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Что не так, и как получить список всех фото?


Ответы (1 шт):

Автор решения: Svetl9chok

Поскольку в русском интернете я не нашел нужный ответ выложу свое решение данной проблемы

Поскольку с версии >=6 надо делать лишнюю проверку на права доступа может быть. Надо сделать сначала определённую махинацию

   private const val MY_PERMISSIONS_REQUEST = 1234
    private val PERMISSIONS = arrayOf<String>(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
 
   class MainActivity : AppCompatActivity() {
        private lateinit var imageList: RecyclerView
        private var isGallery = false
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            imageList = findViewById(R.id.image_list)
    
        }
    
        override fun onResume() {
            super.onResume()
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isPermissions()){
                requestPermissions(PERMISSIONS, MY_PERMISSIONS_REQUEST)
                return
            }
    
            Log.i("Gallery","onResume ${isGallery}")
            if (!isGallery){
    
                
                val file = getCameraImages().reversed()
    
                Log.i("Gallery","${file.size}")
                imageList.layoutManager = LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false)
                imageList.adapter = AdapterImage(this,file)
    
                isGallery = true
            }
        }
    
        override fun onRequestPermissionsResult(
            requestCode: Int,
            permissions: Array<out String>,
            grantResults: IntArray
        ) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults)
            if (requestCode == MY_PERMISSIONS_REQUEST && grantResults.isNotEmpty()){
                if (isPermissions()){
                    (Objects.requireNonNull(this.getSystemService(Context.ACTIVITY_SERVICE)) as ActivityManager).clearApplicationUserData()
                    recreate()
                }
            }
        }
    
        @SuppressLint("NewApi")
        private fun isPermissions():Boolean{
            PERMISSIONS.forEach {
                if (checkSelfPermission(it) != PackageManager.PERMISSION_GRANTED){
                    return true
                }
            }
            return false
        }
    
    
        fun getCameraImages(): List<String> {
            val uri: Uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
            val cursor: Cursor?
            val column_index_data: Int
            val column_index_folder_name: Int
            val listOfAllImages = ArrayList<String>()
            var absolutePathOfImage: String? = null
    
            val projection = arrayOf(MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME)
    
            cursor = contentResolver.query(uri, projection, null,
                null, null);
    
            column_index_data = cursor!!.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)
            column_index_folder_name = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)
            while (cursor.moveToNext()) {
                absolutePathOfImage = cursor.getString(column_index_data)
                listOfAllImages.add(absolutePathOfImage)
            }
            return listOfAllImages
        }
    
    
    
    }

Так мы получить список с сылками на каждую фотографию из вашей галереи и дальше как кому удобно загружать через bitmap зная путь к файлу либо через Glide

→ Ссылка