9
votes

Accès à l'API 29 Mediastore

Mon application crée des listes de lecture dans le médiastore Android. Tout va bien pour les API, y compris 28, cependant, l'API 29 semble nécessiter des autorisations supplémentaires. L'insertion d'un nouveau nom et identifiant de playlist fonctionne sans problème. Lorsqu'il s'agit d'insérer l'ID de piste et l'ordre de lecture, une exception d'autorisation d'accès est levée. En vérifiant l'URI, j'ai constaté que lorsque resolver.insert pour l'API 29, l'erreur d'exception est:

Uri exturi = MediaStore.Audio.Playlists.Members.getContentUri("external", playlist_id);
// exturi : content://media/external/audio/playlists/227/members

// values : audio_id=146 play_order=0
values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, play_order);
values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, audio_id);

try {
    resolver.insert(exturi, values);
} catch (Exception e) {
    e.printStackTrace();
}

Le code:

java.lang.SecurityException: myapp_name has no access to content://media/external_primary/audio/media/146

Une chose étrange est que bien que l'insertion d'une nouvelle liste de lecture dans Mediastore fonctionne, mais l'ajout de pistes (track_id, ordre de lecture) donne une erreur d'autorisation d'accès

Comment résoudre cette erreur d'exception pour l'API 29?


7 commentaires

n'utilisez pas seulement externe codé en dur, utilisez le volume primaire externe.


developer.android.com/training/data-storage/shared/media Essayez d'utiliser MediaStore.VOLUME_EXTERNAL_PRIMARY (sur l'API <= 28, utilisez plutôt VOLUME_EXTERNAL)


@Khoa Nguyễn a essayé cela en vain


@Theo Une chance? Votre téléphone dispose-t-il d'une carte SD? (J'ai des rapports d'erreur à ce sujet, mais je ne peux pas reproduire)


J'ai le même problème. Je peux supprimer des pistes d'une playlist, mais lors de l'ajout, j'obtiens la même exception sur l'API 29. Avez-vous déjà trouvé une solution? Je serais très heureux de vous aider à ce sujet.


Il semble en fait être un bogue connu sous Android 10: issuetracker.google.com/issues/139964268 . Le mettre en vedette peut aider à une solution plus rapide ... cela peut prendre du temps avant qu'il ne soit corrigé. Est-ce que quelqu'un sait si la création de listes de lecture via m3u est également affectée?


Cela m'arrive également lors de la création d'une nouvelle playlist. La playlist est créée, tho!


3 Réponses :


6
votes

Je pense qu'il s'agit d'un bogue Android 10, j'ai donc déposé un rapport ici: https://issuetracker.google.com/issues/147619577 (comprend des instructions pour un cas de test d'émulateur pour le reproduire si cela vous intéresse). Veuillez envisager de le mettre en vedette pour informer l'équipe Android que cela vous concerne.

D'après ce que je peux dire, cela n'affecte que les fichiers sur le stockage `` externe '', comme les cartes SD montées sur /storage/XXXX-XXXX

En attendant, le seul correctif que certains de mes utilisateurs ont pu appliquer avec succès est de déplacer leurs fichiers musicaux vers le stockage interne (redémarrez et attendez que l'analyse des médias se termine pour être sûr que MediaStore est à jour).


7 commentaires

Merci, je vais essayer la musique sur la mémoire interne


déplacé toute la musique sur la carte sd interne mais même résultat android.app.RecoverableSecurityException: com.flyingdutchman.newplaylistmanager n'a pas accès au contenu: // media / external_primary / audio / media / 162


android 10 introduit un nouveau concept de stockage: stockage à portée , si vous n'êtes pas à l'aise avec le stockage à portée, ajoutez cet indicateur à votre fichier manifeste (mais il n'est pas recommandé, car il sera obligatoire dans la prochaine version d'Android): <application android : requestLegacyExternalStorage = "true"> </application>


@toumir Le bogue affecte également les applications ciblant l'API 28 ou utilisant requestLegacyExternalStorage = "true", donc cela n'aide pas.


@now pas de bogue, mais ce comportement affecte les applications ciblant l'API 29 ou +, l'API 28 et les versions inférieures fonctionnent normalement pour moi.


Je serais curieux de le voir. Pourriez-vous partager un projet qui fonctionne?


Au niveau de l'API 29, l'utilisateur doit accorder toutes les actions concernant les fichiers qui ont été créés par d'autres applications. developer.android.com/training/data-storage/shared/media



0
votes

J'ai implémenté le SAF donc n'utilisez pas scopedStorage et ai accès une fois que l'utilisateur accepte. Le fait que je puisse insérer de nouvelles entrées de playlist montre clairement l'accès à MediaStore, je peux également les supprimer. Cependant, essayer d'ajouter des pistes à ces listes de lecture ne fonctionne pas pour api29. L'insertion / suppression d'une nouvelle liste de lecture n'implique aucun fichier situé sur des cartes SD internes ou externes car il s'agit simplement d'ajouter des valeurs.

les autorisations pour les cartes sd internes et externes:

2020-07-12 14:39:04.435 11858-11858/com.flyingdutchman.newplaylistmanager E/onCreate:: uriPermission: UriPermission {uri=content://com.android.externalstorage.documents/tree/17F5-240A%3A, modeFlags=3, persistedTime=1594551961263}
2020-07-12 14:39:04.435 11858-11858/com.flyingdutchman.newplaylistmanager E/onCreate:: uriPermission: UriPermission {uri=content://com.android.externalstorage.documents/tree/primary%3A, modeFlags=3, persistedTime=1594551926876}

La question devient maintenant

Comment puis-je m'assurer que les autorisations saf sont reconnues par la méthode resolver.insert lors de l'insertion / modification de pistes dans la base de données Media


3 commentaires

J'ai également implémenté SAF mais quand j'appelle la mise à jour sur un contentresolver par exemple. contentResolver.update(mediaFileUri, values, null, null); il lève toujours une exception RecoverableSecurityException avez-vous trouvé un moyen dont nous n'avons pas besoin pour attraper cette exception et demander l'autorisation pour chaque fichier individuellement? C'est ce que je fais en ce moment mais je déteste vraiment ça et c'est un vrai problème.


@Vince VD, pas plus loin. Il est incroyable que personne ne semble créer de listes de lecture dans Android 10. En attendant, Android11 approche à grands pas et de plus en plus de choses deviennent obsolètes. Tentant d'abandonner


La création de listes de lecture semble fonctionner sur de nombreuses applications de lecteurs MP3 sur le Play Store, mais ce que j'ai remarqué, c'est qu'elles n'insèrent pas de nouvelle liste de lecture dans le MediaStore. Je pense donc qu'ils gèrent leur propre base de données avec des listes de lecture et il semble que c'est notre seule option pour le moment.



0
votes

Android 11 et les choses deviennent vraiment bizarres. Bien que j'obtienne toujours la même erreur que celle décrite ci-dessus, j'ai découvert que dans le dossier Musique de la carte SD interne , une liste de lecture .m3u est créée SANS écriture directe de fichier io. Le contenu ressemble à:

        ContentValues values = new ContentValues();
        values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, String.valueOf(base));
        values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, audio_id);
 resolver.insert(playlist_members_uri, values);

etc ... donc les pistes de la carte sd interne s'affichent comme vous vous attendez alors que celles de la carte sd externe montrent un chemin avec plusieurs niveaux de chemin relatifs

Le code est inchangé

#EXTM3U
Bernie Marsden/06 - Trouble .mp3
Bernie Marsden/11 - You Better Run .mp3
../../../1408-1411/Music/music/Blues Of Desperation/08. Distant Lonesome Train.mp3
../../../1408-1411/Music/music/Fairport Convention-Unhalfbricking-1969/Fairport Convention - Unhalfbricking - 05 - Cajun Woman.mp3
../../../1408-1411/Music/music/Live/05. Are You Happy.mp3

. Je soupçonne qu'Android 11 ne couvre pas suffisamment les cas d'utilisation et je soupçonne que de nombreuses applications disparaissent du magasin ou qu'il y aura des changements importants


0 commentaires