checkSelfPermission méthode ne fonctionne pas dans targetSdkVersion 22
CheckSelfPermission
méthode ne fonctionne pas comme prévu et c'est toujours un retour de zéro dans android 6.0(Guimauve). Parce que la cible sdk a 22 ans et je suis à l'aide de Client http pour la connexion réseau. Voici l'extrait de code.
private void insertDummyContactWrapper() {
List<String> permissionsNeeded = new ArrayList<String>();
final List<String> permissionsList = new ArrayList<String>();
if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION))
permissionsNeeded.add("GPS");
if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS))
permissionsNeeded.add("Read Contacts");
if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS))
permissionsNeeded.add("Write Contacts");
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
//Need Rationale
String message = "You need to grant access to " + permissionsNeeded.get(0);
for (int i = 1; i < permissionsNeeded.size(); i++)
message = message + ", " + permissionsNeeded.get(i);
showMessageOKCancel(message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
});
return;
}
requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
return;
}
insertDummyContact();
}
@TargetApi(Build.VERSION_CODES.M)
private boolean addPermission(List<String> permissionsList, String permission) {
if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permission);
//Check for Rationale Option
if (!shouldShowRequestPermissionRationale(permission)) return false;
}
return true;
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {
Map<String, Integer> perms = new HashMap<String, Integer>();
//Initial
perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED);
perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED);
//Fill with results
for (int i = 0; i < permissions.length; i++)
perms.put(permissions[i], grantResults[i]);
//Check for ACCESS_FINE_LOCATION
if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
//All Permissions Granted
insertDummyContact();
} else {
//Permission Denied
Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)
.show();
}
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}"
- Double Possible de Guimauve Autorisations de travail pour TargetVersion en dessous de 23
InformationsquelleAutor Mithun S | 2015-10-29
Vous devez vous connecter pour publier un commentaire.
La méthode
Context#checkSelfPermission(String)
a été ajouté à l'API 23. Également ci-dessous API 23 il est inutile que l'autorisation est toujours accordé. Faire un chèque pour la version de l'API avant de manipuler les autorisationsRéférence: http://developer.android.com/reference/android/content/Context.html#checkSelfPermission(java.lang.String)
checkPermission (String permission, int pid, int uid)
qui est là depuis API 1.checkSelfPermission
n'existaient pas avant l'API 23. Ce n'est pas pertinente si elle s'enchaîne comme la méthode ne sera jamais rien en dessous de l'API 23. Peu importe ce que vous faites de l'exécution des autorisations de ne pas travailler en dessous de 23. Vérifier l'API d'au moins 23 avant de faire toute la gestion des permissions. Vous n'obtiendrez jamais de l'exécution des autorisations de travail en dessous de 23.checkSelfPermission
(developer.android.com/reference/android/support/v4/content/...). Celui-ci fonctionne (et renvoie toujoursPERMISSION_GRANTED
sur l'API < 23).Si votre demande vise un niveau API avant le 23 (Android M) alors à la fois:
ContextCompat#checkSelfPermission et Contexte#checkSelfPermission ne fonctionne pas et renvoie toujours 0 (PERMISSION_GRANTED). Même si vous exécutez l'application sur Android 6.0 API (23).
Il n'est pas totalement vrai que si vous ciblez une API de niveau avant le 23 puis vous n'avez pas à prendre soin d'autorisations. Si vous ciblez une API de niveau avant 23:
Comme je l'ai dit dans le 1er point, si vous ciblez une API de niveau avant le 23 sur Android 6.0 puis ContextCompat#checkSelfPermission et Contexte#checkSelfPermission ne fonctionne pas.
Heureusement, vous pouvez utiliser PermissionChecker#checkSelfPermission de vérifier au moment de l'exécution des autorisations.
Exemple de code:
Afin d'obtenir la cible Version du Sdk, vous pouvez utiliser:
Il fonctionne sur Nexus 5 avec Android M.
PermissionChecker#checkSelfPermission
si vous n'êtes pas en ciblant au moins SDK 23? Les autorisations sont toujours accordée, même sur un kit de développement logiciel 23 de l'appareil, alors que le ciblage SDK 22 ou inférieur.Condition 'targetSdkVersion >= Build.VERSION_CODES.M' is always 'true'
(importationandroid.R.attr.targetSdkVersion
). Au lieu de cela, si j'utilise ce bloc try-catch pour obtenir cible version du SDK, Android Studio dit ceci:Cannot assign a value to final variable 'targetSdkVersion
. Quel est le problème?Lorsque le ciblage d'une API de niveau avant le 23, un mode de compatibilité s'applique. L'ancienne autorisation de comportement est en cours d'exécution, même sur les appareils fonctionnant sous Android 6. Pour utiliser le nouveau système d'autorisation, vous avez pour objectif d'API 23 (ou plus dans le futur).
La pleine comportement est spécifié dans la documentation: https://developer.android.com/training/permissions/requesting.html