Pick an image, view it, copy it and get full access to it without SAF and/or storage permissions on Android 11+

Pick an image via ActivityStarter and display it with Picasso (without READ permission) on all Android versions. On Android 11+, the image can then be copied to the Shared folder /Pictures using its contentUri, granting full access to it via the app. The new (copied) image can then be edited/compressed as desired, without (storage) permissions.

On Android < 11, WRITE_EXTERNAL_STORAGE permission is of course required for this. Access must then be done via the real path (i.e., not via contentUri).

In this way, READ_EXTERNAL_STORAGE and READ_MEDIA_IMAGES (from Android 13 onwards) and SAF can be avoided (on Android 11+). In addition, READ_MEDIA_IMAGES is no longer permitted without special permission from Google since May 2025. See also my guide Some Basics on Android Storage.

Blocks

imagePicker.aia (357.7 KB)

Credit to Sunny (@vknow360) for his great Picasso extension.


Tested on Android 16, 13, 8 and 7 (Compnion & APK).

I'm curious if I missed anything, so please test it and give feedback, especially if it works with @TIMAI2's (modified) ImageConverter extension.

5 Likes

Note:
I used the File component (as a dummy) to declare WRITE permission in the Manifest. In the next update, I will ensure that WRITE_EXTERNAL_STORAGE is automatically declared in the Manifest (on Android < 11) without having to use the File component.

Great! You've created a solution that countless users have struggled with for months /years!

1 Like

Hi @Anke ! Thank you for your job.
I have some questions.
1 - Is the file component needed? I see that it is not used in blocks. I don't understand why it is in your app
2 - I have to resize my image before save it. I'm going to use extension ImageConvertor by TIMAI2 after copyImage. Is the right choice?
3 - Do you think I will have permission problems due to "output" path asked in Image Convertor Resize block?
4 - what is the right order in app flow?
First CopyImage, After Resize
First Resize, After CopyImage

I see that with you app I solve permission problems, but I would avoid to reintroduce these with "resize" block of ImageConvertor.

Can you suggest the right use of your app + ImageConvertor resize block in order to avoid permission problems?
Thank you so much!

I am going to risk referring you back to here (you seem to be going around in circles, so we might as well do the same!):

(instead of the firebase storage route, if you want the "owned" resized image in your shared storage, you can just copy/move it from your ASD). See:

I also suggest you actually try all the alternatives you ask questions about, and then come back with your results, before asking any further questions.

Hi @TIMAI2, sorry for it, but as I often explained you I'm not an expert and I try to well understand the work flow by asking to teacher as you, @Anke and other people ( thank you so much for your patience!!).

I have the feeling that in this case solution by Anke (copyImage+imageConvertor) is simpler... so I only kindly ask a reply to my doubts...
I think that @Anke and you can easily give me the info I asked.
Thank you!

WRITE permission is only needed for Android < 11. On Android 11+ no storage permissions at all are required.

Copy it to a Shared folder (/Pictures, /DCIM, /Documents), resize it and do what you want with this image file on Android 11+ without permissions. (As I said, on Android < 11 you must request WRITE permission.)