I'm running through many permissions tagged PROTECTION_NORMAL
and PROTECTION_DANGEROUS
in a ListView
. Upon click my application calls ActivityCompat.requestPermission()
.
All permissions I tested (by that I mean all normal
and dangerous
permissions for API-7 and above I could find) are working fine on my Emulator, except for some:
Requesting CHANGE_NETWORK_STATE
always returns PackageManager.PERMISSION_DENIED
(without even prompting). I would expect it granted by default since it's flagged normal
, or if the documentation is wrong, to be prompted for it then.
Requesting GET_ACCOUNTS
works after prompting, but the documentation lists this permission as normal
not dangerous
(the dialog asks for "access your contacts"). I would expect it granted by default since it's flagged normal
and not to be prompted for it.
Is listed as a permission from the SMS
permission group, but that permission does not exists in the Manifest.permission
package.
Yes, all permissions are in my AndroidManifest.xml.
Questions
- Am I the only one to have this?
- Is it emulator-specific?
- Is the documentation faulty or is the preview build wrong?
Indeed they are.
Turns out those are work-in-progress and mostly acknowledge bugs.
- https://code.google.com/p/android-developer-preview/issues/detail?id=2993
- https://code.google.com/p/android-developer-preview/issues/detail?id=3083
I posted a new bug for GET_ACCOUNTS
, that was yet to be reported.
Mostly to be fixed for final release / documentation (aka NOT preview).
As of Marshmallow (since preview 3), introspection shows CHANGE_NETWORK_STATE
has been moved to protection level signature|appop|pre23|preinstalled
. Using requestPermissions()
will not work on this. It seems the documentation is not up-to-date. Actually, CHANGE_NETWORK_STATE
has also been merged with WRITE_SETTINGS
, as suggested by the logcat output:
was not granted either of these permissions: android.permission.CHANGE_NETWORK_STATE, android.permission.WRITE_SETTINGS.
As a user, you may grant both permissions by going into "Settings / Apps / Configure apps / Modify system settings" and turn on "Allow modify system settings". Your app may trigger the right activity directly (although that's a pretty rude user experience):
Uri selfPackageUri = Uri.parse("package:" + getApplicationContext().getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, selfPackageUri);
startActivity(intent);
Finally, you may check if this is allowed by calling Settings.System.canWrite()
.
The docs for requestPermission()
state that it should only be called for permissions which are dangerous
protection level and not already granted. Are you calling checkSelfPermission()
first and only requesting if it fails?
The current images are still previews, so it is possible that something is misbehaving. However, it stands to reason that if the docs state the APIs should only be called under certain conditions, they may misbehave if those conditions aren't met.