Saturday, 22 April 2017

getExternalStoragePublicDirectory deprecated in Android Q



As getExternalStoragePublicDirectory has been deprecated in Android Q, and the recommendation is to use other means. then how can we specify that we want to store the generated photos from a camera app into the DCIM folder, or a custom sub-folder within the DCIM?




The documentation states that the next 3 options are the new preferred alternatives:




  1. Context#getExternalFilesDir(String)

  2. MediaStore

  3. Intent#ACTION_OPEN_DOCUMENT



Option 1 is out of the questions as it would mean that the photos get deleted if the app gets uninstalled.




Option 3 is also not a choice, as it would require the user to pick the location through the SAF file explorer.



We are left with option 2, the MediaStore; but there is no documentation on how to use it as a replacement for getExternalStoragePublicDirectory in Android Q.


Answer



Based on the docs, use DCIM/... for the RELATIVE_PATH, where ... is whatever your custom subdirectory would be. So, you would wind up with something like this:



      val resolver = context.contentResolver
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, "CuteKitten001")

put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/PerracoLabs")
}

val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

resolver.openOutputStream(uri).use {
// TODO something with the stream
}



Note that since RELATIVE_PATH is new to API Level 29, you would need to use this approach on newer devices and use getExternalStoragePublicDirectory() on older ones.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...