2 years ago

#7150

test-img

faizan

Android Scope storage - Download Images and store in Downloads directory

I updated my project to target sdk 31 from 28. I am downloading images from a url into a folder Download/MyMainFolder/folder1/folder2/iamge1.png.

The path I was setting in downloadmanager

setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,/MyMainFolder/folder1/folder2/iamge1.png )

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath + "/MyMainFolder/folder1/folder2/iamge1.png"

I created a method savePhotoToExternalStorage:

private fun savePhotoToExternalStorage(displayName: String,  path:String) {
//here path is = 
//Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolute//Path + "/MyMainFolder/folder1/folder2/iamge1.png"
        val imageCollection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
            MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
        } else MediaStore.Images.Media.EXTERNAL_CONTENT_URI

        val contentValues = ContentValues().apply {
            put(MediaStore.Images.Media.DISPLAY_NAME, displayName)
            put(MediaStore.Images.Media.MIME_TYPE, "image/png")
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
                put(MediaStore.Images.Media.RELATIVE_PATH, path)
            }
        }
        try {
            val insert = context?.contentResolver?.insert(imageCollection, contentValues)
            Log.d(TAG, "Insert $insert")

        }catch (e: IOException) {
            e.printStackTrace()
        }

    }

Here is my retrieve all images data which is working on android 11 but not on Android 10:

 fun getAllImages(context: Context): MutableList<String> {

        val TAG = ImageManager::class.java.simpleName
        val imagesColumns = arrayOf(MediaStore.Images.Media._ID,MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_TAKEN)
        val imagesOrderBy = MediaStore.Images.Media.DATE_TAKEN + " DESC"
        /*this query retrieves images from external memory and load in Cursor */
        val imageCollection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
            MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
        } else MediaStore.Images.Media.EXTERNAL_CONTENT_URI

        Log.d(TAG, "getAllImages: imageCollection $imageCollection")
        val projection = arrayOf(
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA,
            MediaStore.Images.Media.DISPLAY_NAME,
            MediaStore.Images.Media.DATE_TAKEN
        )
        val imagesCursor = context.contentResolver.query(imageCollection, imagesColumns, null, null, imagesOrderBy)
        val fileNames = mutableListOf<String>()
        imagesCursor?.let {
            val imagesCount = imagesCursor.count

            for (i in 0 until imagesCount) {
                it.moveToPosition(i)
                val dataColumnIndex = it.getColumnIndex(MediaStore.Images.Media.DATA)
                fileNames.add(it.getString(dataColumnIndex))
            }
        }

        imagesCursor?.close()

        return fileNames
    }

android

storage

android-10.0

android-11

scoped-storage

0 Answers

Your Answer

Accepted video resources