Je souhaite vérifier une autorisation dans un fragment.
mon code:
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
android.Manifest.permission.ACCESS_FINE_LOCATION)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(getActivity(),
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
1);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
mais onRequestPermissionsResult
pas appelé après autorisation ou refus.
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
Log.e("test","0");
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
//yes
Log.e("test","1");
Intent intent = new Intent(getActivity(), MapsActivity.class);
intent.putExtra("latitude", 35.694828);
intent.putExtra("longitude", 51.378129);
startActivity(intent);
} else {
utilityFunctions.showSweetAlertWarning(getActivity(),r.getString(R.string.str_warning_title_empty),
r.getString(R.string.str_you_must_allow_this_permission_toast),
r.getString(R.string.str_warning_btn_login));
Log.e("test","2");
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
android
android-fragments
android-permissions
S.M_Emamian
la source
la source
Réponses:
J'ai fait ce qui suit pour vérifier une autorisation à l'intérieur d'un fragment.
if (ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(getActivity(), new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION); } else { Log.e("DB", "PERMISSION GRANTED"); }
la source
C'est comme ça que j'ai fait, ça marche pour moi. Merci!
Pour l'activité:
ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);
Pour le fragment:
requestPermissions(permissionsList, REQUEST_CODE);
la source
Fragment a
requestPermissions()
etonRequestPermissionsResult()
méthodes, utilisez-le.Mais
checkSelfPermission()
est deActivityCompat
(pas obligatoireActivity
, seulementContext
).if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions( //Method of Fragment new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS_CODE_WRITE_STORAGE ); } else { downloadImage(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_PERMISSIONS_CODE_WRITE_STORAGE) { if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE) && grantResults[0] == PackageManager.PERMISSION_GRANTED) { proceedWithSdCard(); } } }
la source
onRequestPermissionsResult
est invoqué dans l'activité et non dans le fragment. EssayezonRequestPermissionsResult
plutôt de remplacer dans l'activité.la source
onRequestPermissionResult
fragment. L'explication et la manière de recevoir le résultat fragmenté sont expliquées dans la réponse de ThetNaing Mizo .En utilisant Kotlin, vous appelez
requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)
et ajoutez le remplacement suivant à votre fragmentoverride fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit { }
la source
Pour gérer les autorisations dans une méthode d'
Fragment
appelrequestPermissions
. Si vous remplacez laonRequestPermissionsResult
méthode à la fois dans le fragment et dans l'activité, contenant ce fragment, assurez-vous d'appelersuper.onRequestPermissionsResult(...)
la méthode d'activité pour propager l'appel à laonRequestPermissionsResult
méthode dans le fragment.la source
Ce qui a fonctionné pour moi a été d'appeler la méthode onRequestPermissionsResult dans l' activité à l' intérieur de laquelle le fragment est implémenté plutôt que de l'appeler dans fragment lui-même. À l'intérieur de la méthode onCreateView dans le fragment:
Button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA); }else{ //Do your work fetchMethod(); } } });
Dans l'activité qui aide à implémenter le fragment, en dehors de la méthode onCreate :
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_MEDIA: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { fetchMethod(); }else{ Toast.makeText(getApplicationContext(), "Permission not granted!", Toast.LENGTH_SHORT).show(); } break; default: break; } }
la source
Si vous avez fermé votre autorisation d'application à partir des paramètres, vous ne pouvez pas ouvrir votre autorisation à partir du code ou de votre version Android inférieure à Marshmallow.
Vous pouvez consulter cette documentation https://developer.android.com/training/permissions/requesting.html Et ceci est un exemple https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html
la source
Je me suis fait trébucher en utilisant
checkSelfPermission()
dans unFragment
et je me demandais quelle serait la meilleure approche pourContext
être nul (spécifique à Kotlin) ... devrais-je utiliser!!
ou autre chose ?Je suis allé avec quelque chose d'autre basé sur le code que j'ai trouvé dans iosched . Jetez un œil à l'exemple ci-dessous et rappelez-vous, avant que le ne
Fragment
soit attaché à unActivity
, leContext
sera nul.private fun fineLocationPermissionApproved(): Boolean { val context = context ?: return false return PackageManager.PERMISSION_GRANTED == checkSelfPermission( context, Manifest.permission.ACCESS_FINE_LOCATION ) }
la source