Ho iniziato a lavorare sull'autorizzazione di runtime di Android M. Qui sto affrontando il problema che se requestPermissions
viene chiamato dalla classe alloranon viene chiamato nella classe . Ma se requestPermissions
viene chiamato dalla classe Activity
o dalla classe Fragment
, il metodo onRequestPermissionsResult
viene chiamato nella stessa classe.onRequestPermissionsResult non chiamato nel frammento di dialogo
Ecco il mio codice di esempio:
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;
}
}
Qui nel codice sto chiamando requestPermissions
metodo Dialog Fragment
di classe. Quindi mi aspetto di ottenere risultati nella stessa classe.
Qualsiasi aiuto è apprezzato. Grazie in anticipo!
EDIT: Qui sto aggiungendo ulteriori dettagli, in modo che sarà più utile agli altri. Precedentemente ho usato getChildFragmentManager() per mostrare DialogFragment.
ContactPickerDialog dialog = new ContactPickerDialog();
dialog.show(getChildFragmentManager(), "Contact Picker");
ma come @CommonWare mi ha chiesto di utilizzare l'attività per mostrare la DialogFragment. Ho fatto le seguenti modifiche e funziona.
ContactPickerDialog dialog = new ContactPickerDialog();
dialog.show(getActivity().getSupportFragmentManager(), "Contact Picker");
È questo il 'DialogFragment' essere dimostrato da un altro frammento (vale a dire, annidato frammenti, 'getChildFragmentManager()') o direttamente da un'attività? – CommonsWare
Viene mostrato da un altro frammento della finestra di dialogo usando getChildFragmentManager(). –
Se dovessi indovinare, il problema è più con i frammenti nidificati, più che con un 'DialogFragment'. Potresti provare ad avere il frammento esistente che dice all'attività di mostrare il 'DialogFragment', per vedere se il problema scompare. – CommonsWare