Guide d'adaptation des autorisations multimédias Android 13

Dans les versions majeures récentes du système Android, une grande partie de l'orientation de la mise à jour s'est concentrée sur la confidentialité et la sécurité. Chaque version ajoutera de nouvelles restrictions de confidentialité et de sécurité, ou mettra à niveau les éléments de confidentialité précédents.

  • Stockage partitionné Android 10, restreindre l'accès aux identifiants matériels non réinitialisables, restreindre l'accès aux données du presse-papiers

  • Android 11 applique le stockage partitionné, l'autorisation unique, les autorisations de réinitialisation automatique et la visibilité des packages.

  • Android 12 accorde des autorisations de localisation approximatives, des notifications d'accès au presse-papiers et des exportations de composants plus sécurisées.

  • Android 13 inclut des autorisations multimédias affinées, un sélecteur d'images intégré, le masquage du contenu sensible dans le presse-papiers, le blocage des intentions inégalées, de nouvelles autorisations d'exécution pour les appareils Wifi et des autorisations d'identification publicitaire.

Android 13 a également récemment publié une version officielle. Les nouvelles restrictions de confidentialité et de sécurité de cette version peuvent enfin résoudre deux problèmes de longue date de nombreuses applications.

Dans de nombreuses applications Android, un sélecteur d'images intégré est utilisé pour afficher toutes les images de l'album système à l'utilisateur. Ceci est courant dans des scénarios commerciaux tels que "télécharger des avatars d'utilisateurs et envoyer des images". Cela doit être réalisé en obtenant l'autorisation READ_EXTERNAL_STORAGE. Cette autorisation présente également un énorme risque pour la vie privée. L'application peut expliquer à l'utilisateur que cette autorisation n'est utilisée que lors de la sélection d'images, mais à l'exception du développeur de l'application, qui peut garantir que l'application ne s'appuiera pas sur cette autorisation pour faire secrètement quelque chose dans le fond ? quoi ? Il s'agit également d'un geste impuissant pour les développeurs : l'application souhaite peut-être simplement récupérer les images dans l'album système, mais en raison du mécanisme du système Android, elle est obligée de demander une autorisation plus élevée à l'échelle de l'application.

Pour être honnête, je pense qu’avoir un sélecteur d’images intégré à l’application est effectivement un point qui peut améliorer l’expérience utilisateur. Étant donné que la fonction du sélecteur d'images intégré au système Android est faible depuis longtemps, les scénarios commerciaux de l'application doivent souvent limiter le type d'images, permettre la sélection de plusieurs images et limiter le nombre maximum d'images. choix. Cependant, le système ne peut pas répondre à ces besoins. Si nous attendons que Si l'utilisateur sélectionne une image, puis revient et informe ensuite l'utilisateur que le format d'image n'est pas pris en charge, ou si l'utilisateur est invité à faire des allers-retours pour sélectionner photos plusieurs fois, c'est en effet assez offensant.

Les deux problèmes ci-dessus peuvent enfin être résolus en s'appuyant sur les deux nouveaux éléments de sécurité de la confidentialité d'Android 13 : les autorisations multimédias affinées et le sélecteur d'images intégré . Nous les expliquerons un par un plus tard.

1. Autorisations multimédias affinées

Avant Android 13, si une application souhaitait accéder aux ressources multimédias de l'appareil, elle devait passer l'autorisation READ_EXTERNAL_STORAGE. À partir d'Android 13, le système a subdivisé READ_EXTERNAL_STORAGE en trois autorisations plus claires, qui sont utilisées pour accéder aux trois types de ressources multimédias de l'utilisateur : Image, Vidéo et Audio, permettant aux utilisateurs d'autoriser à la demande et d'éviter l'expansion désordonnée des risques pour la vie privée. .

type de support demander la permission

image

READ_MEDIA_IMAGES

vidéo

READ_MEDIA_VIDEO

l'audio

READ_MEDIA_AUDIO

Nous devons adapter ces trois autorisations via la targetSdkVersion de l'application et la version du système de l'appareil en même temps.

  • Si l'application n'a pas été adaptée à Android 13, c'est-à-dire que la targetSdkVersion est inférieure à 33.

    • À l'heure actuelle, quelle que soit la version du système, les ressources multimédias sont toujours accessibles via l'autorisation READ_EXTERNAL_STORAGE.

  • Si l'application a été adaptée à Android 13, c'est-à-dire que la targetSdkVersion est supérieure ou égale à 33.

    • Si la version du système est inférieure à 33, vous devez toujours transmettre READ_EXTERNAL_STORAGE pour accéder aux ressources multimédias.

    • Si la version du système est supérieure ou égale à 33, ces trois autorisations subdivisées doivent être utilisées pour accéder aux ressources multimédias, et l'autorisation READ_EXTERNAL_STORAGE a expiré.

Pour faire simple, si la version du système et targetSdkVersion sont toutes deux supérieures ou égales à 33, alors vous devez passer ces trois autorisations de subdivision pour accéder aux ressources multimédias. Dans les autres cas, vous devez toujours vous fier à l'autorisation READ_EXTERNAL_STORAGE.

Regardons un exemple pratique

Il y a quelques mois, j'ai publié une bibliothèque open source, un framework de sélection d'images Android implémenté avec Jetpack Compose : Matisse.

https://github.com/leavesCZY/Matisse

Un article a également été publié pour le présenter : Jetpack Compose implémente un framework de sélection d'images

image

Les fonctionnalités et avantages de Matisse incluent :

  • Entièrement implémenté dans Kotlin, rejetant Java.

  • La couche UI est entièrement implémentée avec Jetpack Compose et rejette le système View natif.

  • Prend en charge des thèmes finement personnalisés, avec des thèmes de jour et de nuit fournis par défaut.

  • Prend en charge un filtrage précis des types d’images, affichant uniquement les types d’images souhaités.

  • Prend en charge l'ouverture de l'entrée de photo sur la page de liste d'images et prend en charge les stratégies photo FileProvider et MediaStore.

  • Prend en charge l'acquisition détaillée des informations sur l'image, y compris dix valeurs d'attribut telles que uri, displayName, mimeType, width, height, orientation, size, path, bucketId et bucketDisplayName.

  • Adapté à Android 12.

Bien sûr, Android 13 est officiellement sorti, et j'ai récemment adapté Matisse à Android 13.

En tant que framework de sélection d'images open source, Matisse doit naturellement prendre en compte les deux variables de la targetSdkVersion du référent et la version système de l'appareil. Pour l'autorisation READ_MEDIA_IMAGES d'Android 13, en fait, il suffit de changer la méthode précédemment fixée de demander l'autorisation READ_EXTERNAL_STORAGE pour sélectionner Appliquer simplement.

private fun requestReadImagesPermission() {
    val permission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
        applicationInfo.targetSdkVersion >= Build.VERSION_CODES.TIRAMISU
    ) {
        Manifest.permission.READ_MEDIA_IMAGES
    } else {
        Manifest.permission.READ_EXTERNAL_STORAGE
    }
    if (PermissionUtils.checkSelfPermission(context = this, permission = permission)) {
        //已获得必要权限,可以去加载系统相册图片了
    } else {
        //去申请必要权限
    }
}

De plus, nous devons également déclarer les autorisations les plus appropriées et les moins importantes en fonction de la situation réelle.

Si la targetSdkVersion de l'application est inférieure à 33, continuez à déclarer l'autorisation READ_EXTERNAL_STORAGE.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Si la targetSdkVersion de l'application est supérieure ou égale à 33, vous devez déclarer les autorisations READ_EXTERNAL_STORAGE et READ_MEDIA_IMAGES. De plus, dans ce cas, l'autorisation READ_EXTERNAL_STORAGE ne peut plus être utilisée dans les versions du système après Android 13, donc la maxSdkVersion de cette autorisation peut être définie sur 32, afin qu'elle n'apparaisse pas dans les versions du système après Android 13.

<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

2. Sélecteur d'image intégré 

À partir d'Android 13, le système Android intègre un sélecteur d'images plus puissant, qui permet aux applications d'accéder aux ressources multimédias sur l'appareil de manière plus flexible sans avoir l'autorisation d'afficher tous les fichiers multimédias sur l'appareil. De plus, bien qu'il soit officiellement nommé sélecteur d'images, il prend en charge la sélection de fichiers vidéo dans l'appareil.

Citant la description officielle de Google :

Le sélecteur de photos fournit une interface consultable et consultable qui présente aux utilisateurs les fichiers de leur bibliothèque multimédia, de la date la plus récente à la plus ancienne. Cet outil offre aux utilisateurs un moyen sécurisé et intégré de sélectionner des images et des vidéos sans avoir à accorder à l'application l'accès à l'intégralité de la bibliothèque multimédia.

Si vous autorisez le système à configurer le sélecteur de photos, l'outil est disponible sur les appareils (à l'exception des appareils Android Go) qui répondent aux critères suivants :

  • Propulsé par Android 11 (API niveau 30) ou supérieur.

  • Recevez les modifications apportées aux composants du système modulaire via les mises à jour du système Google.

De plus, si vous autorisez le système à configurer le sélecteur de photos, l'outil se mettra automatiquement à jour et fournira des fonctionnalités étendues aux utilisateurs de votre application au fil du temps sans nécessiter de modification de votre code.

image

Jetons un coup d'œil à la manière dont l'application utilise le sélecteur d'images.

Tout d'abord, étant donné que Google proposera ce nouveau sélecteur d'images aux appareils fonctionnant sous Android 11 et supérieur (à l'exclusion des appareils Go) via Google Play, cette fonctionnalité ne peut pas être utilisée uniquement sur les systèmes commençant par Android 13, nous pouvons utiliser la méthode suivante pour vérifier si l'appareil actuel prend en charge cette fonction.

//compileSdkVersion 需要至少为 33 才可以调用此方法
fun isPhotoPickerAvailable(): Boolean {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        true
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        getExtensionVersion(Build.VERSION_CODES.R) >= 2
    } else {
        false
    }
}

Nous pouvons démarrer le sélecteur d'image via les deux ActivityResultContracts suivants :

  • ChoisissezVisualMedia. Utilisé pour sélectionner une seule image ou vidéo.

  • ChoisissezMultipleVisualMedia. Utilisé pour sélectionner plusieurs images ou vidéos.

Par exemple, lorsque vous n'avez besoin de sélectionner qu'une seule image ou vidéo, vous pouvez utiliser ceci :

private val pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
    if (uri != null) {
        //TODO
    }
}

//选择图片或视频
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))

//仅选择图片
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))

//仅选择视频
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.VideoOnly))

//仅选择 Gif 图片
val mimeType = "image/gif"
pickMedia.launch(
    PickVisualMediaRequest(
        ActivityResultContracts.PickVisualMedia.SingleMimeType(
            mimeType
        )
    )
)

Dans ce cas, le sélecteur d'images s'ouvre en mode demi-écran.

image

De même, si vous souhaitez sélectionner plusieurs images ou vidéos, vous pouvez limiter le nombre maximum de sélections via PickMultipleVisualMedia.

private val pickMultipleMedia = registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(5)) { uris ->
    if (uris.isNotEmpty()) {
        //TODO
    }
}

À ce stade, le sélecteur d'images sera affiché sous une forme développée en plein écran et l'utilisateur sera également averti lorsque le nombre de ressources dépasse la limite.

image

Il convient de noter que le code ci-dessus doit ajouter la version 1.6.0 ou supérieure de la bibliothèque androidx.activity avant de pouvoir être utilisé. De plus, à partir du code source de PickVisualMedia et PickMultipleVisualMedia, nous pouvons voir que le sélecteur d'image intégré dans Android 13 correspond au nouveau Intent MediaStore.ACTION_PICK_IMAGES. Si l'appareil actuel ne prend pas en charge la fonction de sélection de média, il appellera à la place l'intention. .ACTION_OPEN_DOCUMENT pour sélectionner les ressources multimédias. Dans ce cas, la limite supérieure définie par PickMultipleVisualMedia sera naturellement invalide.

3. Fin

Les autorisations multimédias affinées d'Android 13 résolvent le problème de l'expansion désordonnée des risques de confidentialité causés par READ_EXTERNAL_STORAGE, permettant aux utilisateurs d'autoriser à la demande. Le sélecteur d'images intégré permet à l'application de sélectionner de manière flexible les ressources multimédias sans autorisation de l'utilisateur. Il n'est donc pas nécessaire que l'application dispose d'un sélecteur d'images intégré.

Par conséquent, la meilleure façon d’équilibrer l’expérience utilisateur et la sécurité de la confidentialité des utilisateurs devrait être :

  • Avant Android 13, les fonctions métiers étaient encore implémentées via le sélecteur d'images intégré à l'application.

  • Les versions commençant par Android 13 utilisent uniquement le sélecteur d'images intégré au système et abandonnent complètement l'autorisation READ_EXTERNAL_STORAGE.

Il y a quand même du bon dans cette version Android 13 ~

Texte original de :

https://mp.weixin.qq.com/s/ql-QpUzSc2Wv-GyDCBqHzw

Je suppose que tu aimes

Origine blog.csdn.net/weitao_666/article/details/132335988
conseillé
Classement