Android Question [SOLVED] Should I ever add permissions to the manifest or will the IDE handle that?

Sandman

Well-Known Member
Licensed User
I'm upgrading my app for API26 and all that, and realized that the List Permissions window not only show permissions the IDE will auto-add, but also show the permissions I have manually specified in the manifest.

I kind of suspect that the manual permissions in the manifest is leftovers from when I started making this app. I also suspect that I can delete the lot of them and just rely on the IDE to do a good job.Is this correct?

Can I bring out the axe and remove my manually specified permissions? Or are there edge cases where the IDE misses something that I actually need to add manually? And if the latter, how can I tell what I can delete?
 

Erel

Administrator
Staff member
Licensed User
It is not a about the IDE doing a good job or not missing something. The compiler will add all the permissions that are specified in the various types metadata (types used in your program).

In most cases you do not need to add anything.
Cases where you need to add permissions:
- A code snippet based on JavaObject that requires a permission.
- A library that do not declare all permissions as some are optional.
- Make sure to see the runtime permissions tutorial as you might need to add the version specific storage permission.
 

Sandman

Well-Known Member
Licensed User
So basically I can do this:
  1. Copy my current manifest to an external file (backup)
  2. Empty the manifest, save and reopen it to get a fresh manifest template
  3. Add back everything from the backup that wasn't related to permissions
  4. Add permissions required by JavaObjects in my code
  5. Add permissions required by any extra libraries I've installed
  6. Change DirRootExternal/DirDefaultExternal to DirInternal/GetSafeDirDefaultExternal to avoid some permissions
And then I'm done and have a perfect, slim manifest. Correct?

Follow-up questions:

How to determine if JavaObjects require permissions

In my code I have these two JavaObjects:

B4X:
Dim channel As JavaObject
channel.InitializeNewInstance("android.app.NotificationChannel", Array(channelId, Application.LabelName, ImportanceLevel))
and
B4X:
Dim ctxt As JavaObject
ctxt.InitializeContext
Dim manager As JavaObject = ctxt.RunMethod("getSystemService", Array("notification"))
manager.RunMethod("createNotificationChannel", Array(channel))
I'm generally clueless when it comes to JavaObject so I don't really know what to look for. I tried googling for permission and the different names in the code, so "permission android.app.NotificationChannel", "permission getSystemService" and "permission createNotificationChannel". These search terms led me to pages like these:
- https://developer.android.com/reference/android/app/NotificationChannel
- https://developer.android.com/reference/android/content/Context
- https://developer.android.com/training/notify-user/channels

None of these pages seemed to indicate anything regarding permissions.

Please note that I'm not looking for info on this exact JavaObject code. I'm really, really trying to understand the thinking I need to solve this myself and not having to ask on the forum each time. @Erel , how do you know whether some JavaObject requires a permission? Can you look it up somewhere in some reference doc, or is it just something that you have learned over the years through trial and error..?


How to determine if a Library require permissions

In my case I use the very nice lib QRCodeReaderView by @Johan Schoeman. Looking at the lib in the very nice B4x Object Browser by @Vader, which lists permissions, I can see none listed. Yet, looking at the forum page for the lib, Johan has specified three required permissions.

Does this mean that these are the steps to determining what permissions a lib needs?

- Check the documentation on the forum for the lib
- Ask the author
- Test the lib as much as possible in the app and see if it crashes

Did I miss something? The lib doesn't really specify those things itself?
 

Erel

Administrator
Staff member
Licensed User
When I post a snippet based on JavaObject I always include the permissions that need to be added if there are such. If you don't see anything about permissions then they are not required.

@Erel , how do you know whether some JavaObject requires a permission?
Android documentation.

How to determine if a Library require permissions
Proper libraries include all the required permissions automatically and document any optional permissions in the tutorial.
QRCodeReaderView properly declares the three required permissions. You can see it in the XML file and in the IDE under Logs - List Permissions.
 

Sandman

Well-Known Member
Licensed User
Android documentation.
So basically this?
  1. Go to https://developer.android.com/reference
  2. Enter the "RunMethod" method name in search box and go to the method in the docs (*)
  3. If the method require a permission, it's listed there. If none is needed, it's not mentioned.
It's as simple as that, correct?

(*) Seems it's easier to pick the correct match in the dropdown box than in the full page results.


You can see it in the XML file and in the IDE under Logs - List Permissions
Understood, thanks. And it turns out I had an older version of this lib installed, which didn't define the permissions.
 
Top