Android M permission dialog not showing

2019-01-22 16:50发布

问题:

I'm currently trying to adapt my application to the new permissions model of Android M.

I'm collecting all the permissions I require, then run

Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);

requiredPermissions holds the permissions I need like android.permission.WRITE_EXTERNAL_STORAGE.

That routine is definitely executed as I have the Log line in the logcat:

08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE

But the permissions dialog never shows, let alone is onRequestPermissionsResult() called.

What am I doing wrong? Based on some tutorials I found I'm not missing anything. I only have the emulator for testing, no physical device. This is the about screen from settings: Image

It might be worth mentioning something else: If I try to open the overview of installed apps from the home screen I only get launcher3 has exited. I'm not sure if that might be related.

Does anybody have an idea why it's not showing?

回答1:

I experienced the same issue but later I realized I forgot to add the permission to the manifest file. After adding the uses-permission tag, the system showed the dialog. Maybe helps someone.



回答2:

It took my whole day to find out what caused the problem. The original answer helped me.

I fixed by adding tools:remove="android:maxSdkVersion" like this:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>


回答3:

I experienced the same issue because I was using the negative value as a REQUEST_CODE.

requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)

After using positive value, the system showed the dialog. Hope it helps someone.



回答4:

I just had the same problem. My issue was that I wrote the permission at the wrong place in the manifest. Make sure the uses permission is outside of application:

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.android.gms.samples.vision.face.photo"
    android:installLocation="auto"
    android:versionCode="1"
    android:versionName="1" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


    <application
        android:hardwareAccelerated="true"
        android:label="FacePhotoDemo"
        android:allowBackup="true"
        android:icon="@drawable/icon">


回答5:

add

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

in AndroidManifest.xml

Note : The Permission which you want to get. Eg: android.permission.ACCESS_FINE_LOCATION etc.



回答6:

Based on the comment from Hilal (thanks a lot!): In my case my app is indeed using tabhost and the permissions were requested from an Activity inside the tabhost. After starting a separate activity that requests the permissions it is working.



回答7:

I have also come across a situation where the permission dialog doesn't appear or the application crashes when using the <uses-permission-sdk23> element, however the cause appears to be a system bug on current 6.0 devices:

https://code.google.com/p/android/issues/detail?id=189841

Crash exception:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array


回答8:

I have the same issue and the problem is solved after adding the shouldShowRequestPermissionRationale like this:

if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
        Manifest.permission.READ_CONTACTS)) {

} else {
    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

}


回答9:

In our code, it was a simple spelling mistake.

We had:

<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" /> 

It should be:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />


回答10:

I did all the things said in above answers but still dialog was not showing and then I changed targetSdkVersion to 23 in gradle and it appeared . Hope this helps someone



回答11:

Permissions are organised into categories so non-critical ones are granted without the dialog being shown.

I found this the hard way with internet permission, if you're having this issue then changing to a critical permission such as read_contacts will allow you to test your flow and reveal whether the issue is the permission being non-critical or something else.

Normal protection permissions are listed here



回答12:

To add to @shanraisshan's answer, the REQUEST_CODE actually has to be greater than 0, not just non-negative.



回答13:

After searching a while it appears it is required to set the value compileSdkVersion to "android-MNC" or as of today to 23. That requires the Gradle build system which then seems to require Android Studio. At least I couldn't find a single manual about how to set it outside the gradle files.



回答14:

@Override
    public final void validateRequestPermissionsRequestCode(int requestCode) {
       // We use 16 bits of the request code to encode the fragment id when
       // requesting permissions from a fragment. Hence, requestPermissions()
       // should validate the code against that but we cannot override it as we
       // can not then call super and also the ActivityCompat would call back to
       // this override. To handle this we use dependency inversion where we are
       // the validator of request codes when requesting permissions in
       // ActivityCompat.
        if (!mRequestedPermissionsFromFragment
                && requestCode != -1 && (requestCode & 0xffff0000) != 0) {
            throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
        }
    }


回答15:

Had the same issue. Later I realized that we have to declare each and every permission in manifest (even if one is a subclass of another). In my case I declared

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

in my manifest and was trying to access user's coarse location.

ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)

Fixed the problem by adding coarse permission as well in manifest.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>


回答16:

In the manifest, I changed

 <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="22" />

to

 <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     />

Maybe that helps.



回答17:

Add permission in the manifest file as well.



回答18:

Set your targetSdkVersion to 22.



回答19:

had the same (i guess) problem and the solution was removing

import <app package>.Manifest;

autoimported by Android Studio at the top of the file and substitute it with

import android.Manifest; 

and started working



回答20:

In my case the solution is the string itself

android.permission.READ_CONTACTS

I did Manifest.permission.READ_CONTACTS which caused silence error (Noting show on the screen).

Make sure that this is correct



回答21:

If anyone of you guys has an application that changes/modifies WRITE_SETTINGS and are facing this issue. Check out CommonsWare's Answer to WRITE_SETTINGS Ambiguity

I was facing this issue for 2 weeks and later realised that this issue was due to the fact that requestPermissions doesn't work for requesting WRITE_SETTINGS permission. Hope this helps :D



回答22:

In my case I had requested "ACCESS_COARSE_LOCATION" in my manifest file and then request for "ACCESS_FINE_LOCATION" permission in code that's why the Permission Dialog was not opening.



回答23:

I was doing two calls to requestPermissions(), one right after the other. This error message appeared in Logcat (note the misspelling on "request"):

Can reqeust only one set of permissions at a time

requestPermissions() is actually designed to take multiple requests at once; that's what the String array is for.



回答24:

In my case, the permission I was requesting (WRITE_SETTINGS) was more special and required Settings Activity to launch. So dialog was not showing up.

I had to get its permission using the following code:

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);


回答25:

Yet another cause for not getting the permission dialog to show when requesting a dangerous permission...

I had to do Build -> Clean Project and then Build -> Rebuild Project. I guess Android Studio didn't pick up on the changes I made in the manifest.



回答26:

Change the final constant value to 1.

private static final int REQUEST_PERMISSION_WRITE = 1;

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);