Загрузка списка фотографий из галерее
У меня приложение мессанжер и хочу добавить возможность загрузки фотографий, для этого решил сделать отдельную активность где я могу выбрать какие фотографии из галереи я хочу отправить(можно отметить несколько фото), в голове появилась мысль, загрузить лист ссылок на каждую фотографию в галереи в отображение их каждой с помощью 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 шт):
Поскольку в русском интернете я не нашел нужный ответ выложу свое решение данной проблемы
Поскольку с версии >=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