Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onRequestPermissionsResult not being called in dialog fragment

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"); 
like image 912
Dhaval Patel Avatar asked Oct 16 '15 11:10

Dhaval Patel


People also ask

Why can't I call onrequestpermissionsresult () on a dialogfragment?

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. Show activity on this post.

How to get the onrequestpermissionsresult of a fragment in Android?

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.

How to call back onrequestpermissionsresult from activitycompat?

If you call ActivityCompat.requestPermissions (), then it's the Activity 's onRequestPermissionsResult () that will be called back. Show activity on this post. There appears to be a bug in Android, where nested fragments do not support the onRequestPermissionsResult () callback.

How do I get permission for an Android fragment?

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. Hope this helps!


2 Answers

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.

like image 52
minipif Avatar answered Sep 18 '22 00:09

minipif


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.

like image 30
CommonsWare Avatar answered Sep 18 '22 00:09

CommonsWare