Office Hours Transcript: 2021-08-19
Trying the beta now :)
sorry for the delay
I’m multitasking, and this task had been pre-empted
how can I help you today?
I wanted to share some pictures with my app today and it told me that it doesn’t have access to the file system.
My text was deleted before I could send it.
Anyway, I found the following in my Manifest:
<!-- Read files from sdcard --> <!-- TICKET-123 Permission not needed anymore starting with API 30 -->
I think I’ve misunderstood "READ_EXTERNAL_STORAGE" in Android 11/API 30.
they made a mess out of all of this, and I’m not sure I understand it myself anymore
Could you please clarify for me when and how it is needed going forward from API 30
If YOU don’t understand it anymore, I wonder who still does…
I have largely given up on trying to have some holistic view of all of this – at this juncture, I focus on specific problems
so… where is this file that you are trying to share, and how did you get the path to the file?
I was in the gallery on an emulator for API 30, selected two pictures, "share with" and then selected my app.
that should have triggered
ACTION_SEND_MULTIPLE, where you would get two
Uri values, one per picture
if my analysis is correct, how are you using those
Uh… looks at code
so, that gives you the
Uri objects themselves — are you sharing them yourself via
ACTION_SEND_MULTIPLE? or what are you doing with the
Uri objects, once you have them, that is leading to this error?
This is done in the "onCreate" of a "HandleFilesActivity". We put them in a variable called "list" and then then return from "onCreate" to… I have no idea :)
That does not give me a lot to go on. Ideally, you would just share those
Uri values. IOW, if you are accepting
Uri objects from outside and sending
Uri objects back to the outside, your app should have no need to ever read the content pointed to by those
Uri values, and permissions should not come into play.
Why should it have no need to read the content?
Yes, it’s sparse. I’m still tring to understand the code. It’s undocumented
Think of a desktop OS. If you drag-and-drop some file from a desktop file manager (File Explorer, Finder, Nautilus, etc.) into some program, the file manager does not need to read the content of the file.
Yes, but we eventually wanna do that, as we upload things to a server and whatnot.
Which is another, later step.
And that’s fine. Make sure that you are either only using those
Uri objects in the misnamed
HandleFilesActivity, or you pass them along to other activities carefully and with the correct flags: https://commonsware.com/blog/2020/08/08/uri-access-lifetime-still-shorter-than-you-might-think.html
and, reading the content from those
Uri objects should never involve the filesystem, so you should not get an error related to filesystem permissions
for uploading to a server, there are recipes for doing that using just a
I just found this gem:
// check for file access
if (!AndroidUtils.hasPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE))
Which might be the solution to my mystery
OK, that checks to see if you have that permission, presumably
but, you know where you are getting the
Uri objects initially, and you know where your code is crashing
you need to trace through your code to understand how you are getting from Point A to Point B
and, you need to determine why you are doing any filesystem operations here, because so far, I haven’t heard anything that should involve the filesystem
Those come later. I assumed they came in this step, but apparently it’s just a literal check for the permission
Which I didn’t expect
Tbh, I came here because I knew my understanding of READ_EXTERNAL_STORAGE is lacking. I didn’t look into the code beforehand.
And I didn’t expect it was so foobared that even you couldn’t give holistic advice anymore. Damn.
unfortunately, I have been rather "heads down" for the past 1.5 years and haven’t been fussing with a lot outside of what I need to
so, I am rusty on the issue
Ok. What did you do instead?
um, I have been helping a consulting client
their app does not presently have the need to read content from the device, which means I haven’t been working on this specific area that is causing you grief
If I remove that check, it works flawlessly, at least for my test case.
I am gonna create a ticket and bugger my boss…
I have another question about Accounts on Android. I don’t really get how they are secured and if App "Oscar" can access the Account data of App "Mathilde" or not.
I have avoided
AccountManager throughout my Android career, so I cannot really comment upon it
I think I have asked about this before and got a similar answer :)
But it was worth a shot
early on, it was not very well documented and seemed extremely opinionated in its implmentation
I am uncertain that it got much better
and I can’t remember the last app that I encountered that used it, though I’m not a big consumer of apps that need accounts
Thanks for your answers
sorry I could not be of more direct assistance today
It’s good to have someone to talk technical about and ask questions.
I’m happy to help!
that’s a wrap for today’s chat — the next one is Saturday in the 4pm US Eastern time slot
have a pleasant day!