web-dev-qa-db-fra.com

Demander des autorisations à l'utilisateur par programme?

Je souhaite ajouter la fonctionnalité de donner à l'utilisateur la liste des autorisations à approuver juste après la première ouverture de l'application.

Je lis à partir de this article concernant la procédure à suivre.

Mais j'ai encore quelques questions à ce sujet, pour rendre cette fonctionnalité de mon application vraiment dynamique:

  • Comment lire depuis le fichier manifeste la liste des permissions requises? (Ceci pour éviter une vérification explicite codée en dur de chaque autorisation requise)

  • Comment par programme classer ces autorisations commeNORMALetDANGEREUX, car je dois demander explicitement à l'utilisateur uniquement lorsque l'autorisation est de dangereux genre? (Selon la documentation, normal les autorisations sont automatiquement accordées par le système d'exploitation sans demander à l'utilisateur)

4
SoulRayder

Vous devez vérifier chaque fois que l'autorisation météo est accordée ou non à votre application lorsque vous souhaitez effectuer une opération liée à ces autorisations.

Parce que l'utilisateur peut désactiver cette autorisation des paramètres à tout moment.

Permissions et groupes de permissions dangereux:

CALENDRIER 

READ_CALENDAR

WRITE_CALENDAR

CAMERA 

CAMERA

CONTACTS 

READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS

LOCATION 

ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION

MICROPHONE 

RECORD_AUDIO

PHONE 

READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS

CAPTEURS 

BODY_SENSORS

SMS 

SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_Push
RECEIVE_MMS

STOCKAGE 

READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

Source Autorisations dangereuses

Normal Permissions:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

Source Autorisations normales

Obtenir la liste des autorisations requises par programme:

public void readPermission()
{
    try {
        PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
        if (info.requestedPermissions != null) {
            for (String p : info.requestedPermissions) {
                Log.d(TAG, "Permission : " + p);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
4
Priyank Patel

Autant que je sache, il n'y a aucun moyen de lire toutes les autorisations du manifeste par programme. Cependant, puisque vous les avez déjà répertoriés dans le manifeste avant de publier votre APK, vous savez déjà quelles autorisations vous devez demander. N'est-ce pas? 

Supposons que vous avez READ_PHONE_STATE et WRITE_EXTERNAL_STORAGE dans votre manifeste, vous pouvez l'ajouter dans votre vérification d'autorisation dans votre MainActivity.Java:

ArrayList<String> arrPerm = new ArrayList<>();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    arrPerm.add(Manifest.permission.READ_PHONE_STATE);
}
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    arrPerm.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(!arrPerm.isEmpty()) {
    String[] permissions = new String[arrPerm.size()];
    permissions = arrPerm.toArray(permissions);
    ActivityCompat.requestPermissions(this, permissions, MY_PERMISSIONS_REQUEST);
}

Cela déclenchera des demandes d'autorisation, l'une après l'autre, pour WRITE_EXTERNAL_STORAGE et READ_PHONE_STATE. Pour vérifier quelles autorisations ont été accordées, procédez comme suit:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {

    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0) {
                for(int i = 0; i < grantResults.length; i++) {
                    String permission = permissions[i];
                    if(Manifest.permission.READ_PHONE_STATE.equals(permission)) {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            // you now have permission
                        }
                    }
                    if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permission)) {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            // you now have permission
                        }
                    }
                }
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            break;
        }
    }

    // other 'case' lines to check for other
    // permissions this app might request
}
1
user1506104

les autorisations définies dans le manifeste avec <use-permission Android: name = "..." /> fonctionneront automatiquement pour les appareils Android dont le niveau d'API est inférieur à 23. Pour les appareils supérieurs à Android (6.0) , vous devrez vérifier les autorisations au moment de l'exécution.

https://developer.Android.com/guide/topics/security/permissions.html Ce lien contient une liste d'autorisations dangereuses.

0
jay pandya

Les autorisations d'exécution sont ajoutées à Android à partir d'Android 6.0 (API niveau 23), avant que les autorisations ne soient définies dans le manifeste. Mais si Android 6 et supérieur sont nécessaires, vous devez prendre l'autorisation de l'utilisateur (danger) avant de l'exécuter.

De la documentation incluse dans la question 

Si votre application nécessite une autorisation dangereuse, vous devez vérifier si Est en possession de cette autorisation à chaque fois que vous effectuez une opération nécessitant cette autorisation .

Donc, si vous effectuez une tâche nécessitant une autorisation de danger, vous devez demander à l'utilisateur de le faire, sinon une exception d'exécution sera levée. 

Vous pouvez lire ceci pour prendre les autorisations de la meilleure façon 

0
Bills