Outils pour utilisateurs

Outils du site


lang:android:permission

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
lang:android:permission [2022/09/26 09:44] – Création avec "Demande d'accès explicites pour permissions multiples" et "Demande d'accès sur événements" rootlang:android:permission [2023/04/12 13:37] (Version actuelle) – Ajout de "Autorisation avec adb" root
Ligne 1: Ligne 1:
-===Demande d'accès explicites pour permissions multiples===+====Demande de permissions==== 
 +===Demande explicites pour permissions multiples===
  
 <code java> <code java>
Ligne 13: Ligne 14:
 String[] ask_permission = {Manifest.permission.WRITE_EXTERNAL_STORAGE, String[] ask_permission = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
   Manifest.permission.READ_EXTERNAL_STORAGE};   Manifest.permission.READ_EXTERNAL_STORAGE};
-if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +
-  ask_permission = Arrays.copyOf(ask_permission, ask_permission.length+1); +
-  ask_permission[ask_permission.length-1] = Manifest.permission.MANAGE_EXTERNAL_STORAGE; +
-}+
 requestPermissionLauncher.launch(ask_permission); requestPermissionLauncher.launch(ask_permission);
 </code> </code>
Ligne 77: Ligne 75:
  
   * ''app\src\main\AndroidManifest.xml''   * ''app\src\main\AndroidManifest.xml''
 +
 +Déclarer la liste des droits nécessaires.
  
 <code xml> <code xml>
Ligne 98: Ligne 98:
 </code> </code>
  
-  * Filtrer les devices USB dans ''app\src\main\res\xml\device_filter.xml''+  * Filtrer les devices USB autorisés dans ''app\src\main\res\xml\device_filter.xml''
  
 <code xml> <code xml>
Ligne 107: Ligne 107:
 </resources> </resources>
 </code> </code>
 +
 +===Permission se demandant via une fenêtre dédiée et non une simple popup===
 +
 +Exemple avec ''MANAGE_EXTERNAL_STORAGE''.
 +
 +  * Avant API 30
 +
 +Il faut ajouter ''android:requestLegacyExternalStorage=%%"true"%%'' à ''AndroidManifest.xml''.
 +
 +  * A partir de l'API 30
 +
 +Cela se fait en ouvrant une fenêtre dédiée à la modification des droits. On commence par vérifier si on a les droits avant. Puis on vérifie si on a les droits à la fermeture de la fenêtre.
 +
 +Ne pas appelé ''registerForActivityResult'' depuis le constructeur mais depuis ''onCreate''. Si la vue est recréée (''onCreate''), l%%'%%''intent'' est ''unregister''. Il faut donc le ''register'' à nouveau.
 +
 +Le composant ''ActivityResultLauncher'' ne doit pas être appelé depuis ''onCreate'' mais après.
 +
 +<blockquote>Note: You must call registerForActivityResult() before the fragment or activity is created; you cannot launch the ActivityResultLauncher until the fragment or activity's Lifecycle has reached CREATED.<cite>[[https://developer.android.com/training/basics/intents/result|Getting a result from an activity]] {{ :lang:android:permission:getting_a_result_from_an_activity_android_developers_17_01_2023_14_24_47_.html |Archive du 20/09/2022 le 17/01/2023}}</cite></blockquote>
 +
 +<code java>
 +private ActivityResultLauncher<Intent> requestManageAllFilesLauncher;
 +
 +public void onCreate(Bundle savedInstanceState)
 +  requestManageAllFilesLauncher = registerForActivityResult(
 +  new ActivityResultContracts.StartActivityForResult(),
 +    result -> {
 +      if (Environment.isExternalStorageManager()) {
 +        // Accès validé.
 +      }
 +    }
 +);
 +
 +if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
 +  Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
 +  Uri uri = Uri.fromParts("package", getPackageName(), null);
 +  intent.setData(uri);
 +  requestManageAllFilesLauncher.launch(intent);
 +} else {
 +  // OK
 +}
 +</code>
 +
 +Message d'erreur si le composant a été ''unregister'' dû à un nouveau cycle de vie : ''java.lang.IllegalStateException: Attempting to launch an unregistered ActivityResultLauncher with contract androidx.activity.result.contract.ActivityResultContracts$StartActivityForResult@27807b and input Intent { act=android.intent.action.OPEN_DOCUMENT_TREE }. You must ensure the ActivityResultLauncher is registered before calling launch().''
 +
 +[[https://developer.android.com/training/basics/intents/result#custom|Creating a custom contract]] {{ :lang:android:permission:getting_a_result_from_an_activity_android_developers_26_09_2022_14_58_57_.html |Archive du 20/09/2022 le 26/09/2022}}
 +
 +===Autorisation avec adb===
 +
 +Pour les tests, il peut être nécessaire d'activer certaines autorisations sans interaction avec l'utilisateur.
 +
 +<code bash>
 +adb shell appops set --uid com.package MANAGE_EXTERNAL_STORAGE allow
 +</code>
 +
 +Pour avoir la liste des permissions, lancer :
 +
 +<code bash>
 +adb shell 'pm list permissions | sort'
 +</code>
 +
 +====Permission des dossiers====
 +
 +  * Carte SD ou ''/storage/emulated''
 +
 +Ne doit servir que pour stocker des données. Il n'est pas possible d'y stocker des exécutables. Le dossier est monté en ''noexec''.
 +
 +  * Dossier home de l'application ou ''/data/data''
 +
 +Ne doit servir que pour stocker des données spécifiques à chaque application. Il n'est pas possible d'y stocker des exécutables.
 +
 +Pour exécuter des binaires externes, il faut les [[lang:android:packaging#embarquer_un_executable_pour_l_executer_manuellement|embarquer dans l'apk]].
 +
 +[[https://developer.android.com/about/versions/10/behavior-changes-10#execute-permission|Removed execute permission for app home directory]] {{ :lang:android:permission:behavior_changes_apps_targeting_api_29_android_developers_27_09_2022_12_40_59_.html |Archive du 19/09/2022 le 27/09/2022}}
  
lang/android/permission.1664178266.txt.gz · Dernière modification : de root