onRequestPermissionsResult not being called in dialog fragment

android onrequestpermissionsresult not called in activity
runtime permission in fragment android example
onrequestpermissionsresult called multiple times
onrequestpermissionsresult kotlin
get permission result in fragment
cannot find symbol rnimmediatephonecallpackage onrequestpermissionsresult
onrequestpermissionsresult check
onrequestpermissionsresult arrayindexoutofboundsexception

I have started to work on Android M runtime permission. Here I am facing the issue that if requestPermissions is called from Dialog Fragment class then onRequestPermissionsResult not getting called in the same Dialog fragment class. But if requestPermissions is called from Activity class or Fragment class then onRequestPermissionsResult method get called in the same class.

Here is my sample code:

public class ContactPickerDialog extends DialogFragment {
    private static final int READ_CONTACTS_REQUEST_CODE = 12;
    private Context mContext;

    private void loadContact() {
        if(hasPermission(mContext, Manifest.permission.READ_CONTACTS)){
            new ContactSyncTask().execute();
        } else {
            this.requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        Logger.d("TAG", "dialog onRequestPermissionsResult");
        switch (requestCode) {
            case READ_CONTACTS_REQUEST_CODE:
                // Check Permissions Granted or not
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    new ContactSyncTask().execute();
                } else {
                    // Permission Denied
                    Toast.makeText(getActivity(), "Read contact permission is denied", Toast.LENGTH_SHORT).show();
                }
            break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    private static boolean hasPermission(Context context, String permission){
        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
    }

} 

Here in the code I am calling requestPermissions method of Dialog Fragment class. So I am expecting to get result in same class.

Any help is appreciated. Thanks in advance!


EDIT: Here I am adding more detail, so that it will be more helpful to others. Previously I have used getChildFragmentManager() to show the DialogFragment.

ContactPickerDialog dialog = new ContactPickerDialog();
dialog.show(getChildFragmentManager(), "Contact Picker");

But As @CommonWare asked me to use activity to show the DialogFragment. I have made following changes and it works.

ContactPickerDialog dialog = new ContactPickerDialog();
dialog.show(getActivity().getSupportFragmentManager(), "Contact Picker");

There appears to be a bug in Android, where nested fragments do not support the onRequestPermissionsResult() callback. For a DialogFragment, a workaround appears to be to have the fragment wanting to show the dialog call a method on the hosting activity, and the activity shows the DialogFragment itself.

android.app.Fragment.onRequestPermissionsResult java code , I have started to work on Android M runtime permission. Here I am facing the issue that if requestPermissions is called from Dialog Fragment class then  Here I am facing the issue that if requestPermissions is called from Dialog Fragment class then onRequestPermissionsResult not getting called in the same Dialog fragment class. But if requestPermissions is called from Activity class or Fragment class then onRequestPermissionsResult method get called in the same class.

If you're inside a Fragment from support library, call requestPermissions() directly, and your Fragment's onRequestPermissionsResult() will be called back.

If you call ActivityCompat.requestPermissions(), then it's the Activity's onRequestPermissionsResult() that will be called back.

onRequestPermissionsResult not being called in dialog fragment, Android M Permissions: onRequestPermissionsResult() not being called Android onRequestPermissionsResult is getting called only on Activity but not on​  When in AppCompatActivity, you should use ActivityCompat.requestPermissions; When in android.support.v4.app.Fragment, you should use simply requestPermissions (this is an instance method of android.support.v4.app.Fragment) If you call ActivityCompat.requestPermissions in a fragment, the onRequestPermissionsResult callback is called on the activity and not the fragment.

This issue seems to be fixed in Android Support Library 23.3.0 and above versions.

If you’re using Support v4 Fragments, nested fragments will now receive callbacks to onRequestPermissionsResult().

Edit: @AndrewS, here's how you can update.

In your build.gradle(app) file, change the following line to use the latest support library 24.0.0 which is the latest version:

dependencies {
    compile 'com.android.support:appcompat-v7:24.0.0'
}

android, I have started to work on Android M runtime permission. Here I am facing the issue that if requestPermissions is called from Dialog Fragment class then  There appears to be a bug in Android, where nested fragments do not support the onRequestPermissionsResult() callback. For a DialogFragment, a workaround appears to be to have the fragment wanting to show the dialog call a method on the hosting activity, and the activity shows the DialogFragment itself. ###

EDIT:

I suggest to use a new version of Support Library 23.3.0, because Google fixed issue with not calling onRequestPermissionsResult, but if for some reasons you need to use an older version, then see origin answer below.

ORIGINAL ANSWER:

I am using next workaround (together with easyPermissions library):

BaseFragment:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    /** child v4.fragments aren't receiving this due to bug. So forward to child fragments manually
     * https://code.google.com/p/android/issues/detail?id=189121
     */
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    List<Fragment> fragments = getChildFragmentManager().getFragments();
    if (fragments != null) {
        // it is possible that fragment might be null in FragmentManager
        for (Fragment fragment : fragments) {
            if (fragment != null) {
                fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
        }
    }
}

BaseActivity:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(getFragmentContainer())
    if (fragment != null) {
        fragment.onRequestPermissionsResult(requestCode&0xff, permissions, grantResults);
    }
}

Usage:

public class SomeFragment extends BaseFragment implements EasyPermissions.PermissionCallbacks {
    private static final int PICK_CONTACT = 1;
    private static final int READ_CONTACTS_PERM = 2;

    // some code

    @AfterPermissionGranted(READ_CONTACTS_PERM)
    private void pickContactWithPermissionsCheck() {
        if (EasyPermissions.hasPermissions(getContext(), Manifest.permission.READ_CONTACTS)) {
            // Have permission
            pickContactForResult();
        } else {
            // Request one permission
            EasyPermissions.requestPermissions(this, getString(R.string.read_contacts_permission_explanation),
                    READ_CONTACTS_PERM, Manifest.permission.READ_CONTACTS);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        // FIXME problem with incorrect requestCode coming to callback for Nested fragments
        // More information here - https://code.google.com/p/android/issues/detail?id=189121
        if (isVisible() && Arrays.asList(permissions).contains(Manifest.permission.READ_CONTACTS)) {
            requestCode = READ_CONTACTS_PERM;
        }

        // EasyPermissions handles the request result.
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
}

android, I have started to work on Android M runtime permission. Here I am facing the issue that if requestPermissions is called from Dialog Fragment  If you have onRequestPermissionsResult in both activity and fragment, make sure to call super.onRequestPermissionsResult in activity. It is not required in fragment, but it is in activity. It is not required in fragment, but it is in activity.

I had this problem without nested fragments, where the activity was showing the dialog fragment and the result was not getting passed.

Adding super.onRequestPermissionsResult(requestCode, permissions, grantResults); to the Activity's onRequestPermissionsResult() solved the issue.

Android M Permissions: onRequestPermissionsResult() not being , android m runtime permission. here facing issue if requestpermissions called dialog fragment class onrequestpermissionsresult not getting  If you set the activity that you call requestPermissions or AppCompatActivity.requestPermissions with . android:noHistory="true" android:excludeFromRecents="true" in your AndroidManifest.xml then onRequestPermissionsResult() will not be called. This is true if your Activity is derived from Activity or AppCompatActivity.

onRequestPermissionsResult not called on Fragments in Android , android - onRequestPermissionsResult not being called in fragment if defined in both fragment and activity. I have a fragment in which I have recyclerview and  I have the same problem, when I request read storage permission in fragment ,only parent activity's onRequestPermissionsResult was called. This comment has been minimized. Sign in to view

Android M onRequestPermissionResult callback not being invoked , I've debugged and set breakpoints in the onRequestPermissionsResult() method but it never goes into it. This method gets called first: private  There appears to be a bug in Android , where nested fragments do not support the onRequestPermissionsResult () callback. For a DialogFragment , a workaround appears to be to have the fragment wanting to show the dialog call a method on the hosting activity, and the activity shows the DialogFragment itself.

This is a common mistake that people make when coding for marshmallow. When in AppCompatActivity, you should use ActivityCompat. Just installed a plugin that has a requestPermissions check method so that the permissions can be granted for android M before attempting to use the plugin. When using tabris the JAVA onRequestPermissionResult callback is never invoked,

Comments
  • Is this DialogFragment being shown by another fragment (i.e., nested fragments, getChildFragmentManager()) or by an activity directly?
  • It is shown by another Dialog fragment using getChildFragmentManager().
  • If I had to guess, the problem is more with the nested fragments, more so than it being a DialogFragment. You might try having the existing fragment tell the activity to show the DialogFragment, to see if the problem goes away.
  • Are you using native Fragments or the Support lib ?
  • @Kitesurfer Support lib.
  • I used acitivity class and build in android 6.0 using eclipse IDE, i call requestPermission(),but onRequestPermissionsResult() is not execute.
  • @Vasant The issue has been fixed in support library 23.3.0. If you’re using Support v4 Fragments, nested fragments will now receive callbacks to onRequestPermissionsResult().
  • it works fine for me.need to use FragmentActivity in place of Activity.
  • If I'm using nested fragment, is there any way to make the request & result handling both inside fragment? It's weird to handle the result in activity if I requested in fragment.
  • @BakaWaii: I avoid nested fragments. The bug is marked as fixed, though there are some comments suggesting that it is not completely fixed. If you are still experiencing these symptoms, ensure that there is an open issue for it. Otherwise, though, because I avoid nested fragments, I do not know if there is a workaround, besides those listed in the now-closed bug.
  • you can see in my code, I have used DialogFrament's requestPermissions() but onRequestPermissionsResult() is not getting called. As CommonsWare reported, nested fragments do not support the onRequestPermissionsResult() callback.
  • Thanks for this. I sure wish developer.android.com/training/permissions/requesting.html would have mentioned that android.support.v4.app.Fragment#requestPermissions even exists
  • @dexxtr Obviously, as run-time permission requesting starts from API 23.
  • I'm not seeing onRequestPermissionsResult() being triggered as a result of Fragment.requestPermissions()