2016-05-27 2 views
2

Je voudrais vérifier si une application particulière doit gérer les autorisations d'exécution Android Marshmallow en cours d'exécution ou non.Android: Vérifiez si les autorisations d'exécution doivent être demandées ou non

Est-ce que l'hypothèse suivante est correcte?

/** 
* Checks whether runtime permissions must be handled or not. 
* 
* @param context Application context. 
* @return Handle runtime permissions or not. 
*/ 
public static boolean shouldCheckRuntimePermissions(Context context) { 
    return 
      isApplicationWithMarshmallowTargetSdkVersion(context) && 
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; 
} 

/** 
* Checks whether the app is compiled with targetSdkVersion Marshmallow or above. 
* 
* @param context Application context. 
* @return Application targetSdkVersion above 23 or not. 
*/ 
public static boolean isApplicationWithMarshmallowTargetSdkVersion(Context context) { 
    return 
      context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M; 
} 

Voici le tableau que j'ai élaboré où, par exemple ont été nécessaires ACCESS_COARSE_LOCATION autorisations pour demander à l'utilisateur avec les permissions d'exécution Android Guimauve.

==================== 
target SDK |<23| 23| 
==================== 
     |<23| X | X | 
     ------------| 
OS SDK |23 | X | V | 
==================== 

Je sais l'existence de la bibliothèque de soutien helpers, mais je veux les éviter pour ce cas particulier.

+1

Je pense que vous avez seulement besoin de vérifier la construction version sdk que la version cible indique que le sdk vous visiez en développement. –

+0

@LuisMiguelSierra Je ne pense pas, si vous exécutez une application avec targetSDK 23 et OS SDK 22, vous n'avez pas besoin de demander des autorisations d'exécution.Au moins c'est ce que j'ai testé avec le dangereux COARSE_LOCATION. – GoRoS

+0

Votre hypothèse semble bonne. Est-ce que ça fonctionne bien? –

Répondre

3

@LuisMiguelSierra avait raison, j'avais la réponse dans le lien que j'ai posté à la fin de ma question et je ne me suis pas rendu compte du tout. Voici la citation qui répond à ma question et confirme mon hypothèse et les méthodes ont raison:

Sur toutes les versions d'Android, votre application doit déclarer à la fois les normales et les autorisations dangereuses dont il a besoin dans son application manifeste, comme décrit dans Déclaration des autorisations. Cependant, l'effet de cette déclaration est différente en fonction de la version du système et votre niveau de SDK cible de l'application :

  • Si l'appareil est en cours d'exécution Android 5.1 ou plus bas, ou le SDK cible de votre application est 22 ou moins: Si vous répertoriez une autorisation dangereuse dans votre manifeste
    , l'utilisateur doit accorder l'autorisation lorsqu'il installe l'application
    ; si elles n'accordent pas l'autorisation, le système n'installe pas du tout l'application .
  • Si l'appareil fonctionne sous Android 6.0 ou version ultérieure et que le SDK cible de votre application est 23 ou supérieur: L'application doit répertorier les autorisations dans le manifeste et doit demander chaque autorisation dangereuse requise pendant l'exécution de l'application . L'utilisateur peut accorder ou refuser chaque autorisation , et l'application peut continuer à fonctionner avec des fonctionnalités limitées
    même si l'utilisateur refuse une demande d'autorisation.

donc cette hypothèse quand demander des autorisations est confirmée:

==================== 
target SDK |<23| 23| 
==================== 
     |<23| X | X | 
     ------------| 
OS SDK |23 | X | V | 
==================== 
1

Je votre chèque d'activité si (la version de l'API> = 23 et l'autorisation est refusée) demande alors la permission

if (android.os.Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED) { 
     requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION_PERMISSION); 
} 

Et pour obtenir le résultat de l'utilisateur vient passer outre

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_LOCATION_PERMISSION: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        Log.d(TAG,"Premission granted"); 
      }else { 
        Log.d(TAG,"Premission denied"); 
      } 
      break; 
    } 
} 
+0

Salut Abanoub, 1) Je ne veux pas savoir comment demander les autorisations d'exécution que j'ai posté 2) Lire ma dernière phrase où je dis que je ne veux pas utiliser les bibliothèques de soutien. – GoRoS

0

Vous pouvez essayer d'utiliser la bibliothèque de Google Samples. Il gère les contrôles liés à l'autorisation et vous n'avez pas besoin de vous inquiéter de la vérification des versions.

+0

Salut jaibatrik, merci pour la réponse. Je connaissais déjà cet échantillon mais je veux simplement comprendre la logique du «quand demander», pas «comment demander» et si ma supposition est juste ou non. – GoRoS

+0

Si la version du SDK est inférieure à M, vous n'avez pas besoin de vérifier l'autorisation, déclarez-la simplement dans Manifest. Si elle est égale ou supérieure à M, vérifiez l'autorisation en utilisant 'Context # checkPermission'. Si la permission n'est pas là, demandez la permission. – jaibatrik