Comment vérifier si la ressource pointée par Uri est disponible?
J'ai de la ressource (fichier de musique) souligné par des Uri. Comment puis-je vérifier s'il est disponible avant j'ai essayer de jouer avec MediaPlayer?
Son Uri est stocké dans la base de données, de sorte que lorsque le fichier est supprimé ou sur stockage externe qui est démonté, alors je viens d'obtenir exception lorsque j'appel MediaPlayer.prepare().
Dans la situation ci-dessus que je voudrais jouer systèmes de sonnerie par défaut. Je pourrais bien sûr faire qu'après que j'ai attraper exception ci-dessus, mais peut-être il ya une certaine solution plus élégante?
edit:
J'ai oublié de mentionner que les fichiers de musique d'Uri sont effectivement acquises à l'aide de RingtonePreference. Cela signifie que je peux obtenir Uri pointant vers sonnerie de Stockage Interne, de Stockage Externe ou à défaut les systèmes de sonnerie.
Uri exemples sont:
- contenu://settings/system/sonnerie - pour choisir la sonnerie par défaut
- contenu://media/internal/audio/media/60 - pour la sonnerie de Stockage Interne
- contenu://media/externe/audio/media/192 - pour la sonnerie sur Stockage Externe
J'ai été heureux avec le projet de "nouveau Fichier(chemin d'accès).il existe() la méthode, comme il m'a sauvé d'mentionné exception, mais après un certain temps j'ai remarqué qu'il renvoie false pour l'ensemble de mes sonnerie choix...
D'autres idées?
RingtoneManager.getCursor()
? Ma compréhension est que tout, le curseur retourne devrait être disponible...
OriginalL'auteur Koger | 2011-10-04
Vous devez vous connecter pour publier un commentaire.
La raison, la méthode proposée ne fonctionne pas c'est parce que vous êtes à l'aide de la
ContentProvider
URI plutôt que le chemin du fichier. Pour obtenir le chemin du fichier, vous devez utiliser un curseur pour obtenir le fichier.En supposant
String contentUri
est égal au contenu de URI commecontent://media/external/audio/media/192
Je n'ai pas utilisé cette méthode avec des fichiers son ou de stockage interne, mais il devrait travail. La requête doit retourner une seule ligne, directement à votre fichier.
Malheureusement il ne fonctionne pas pour le contenu://settings/system/sonnerie Uri, mais c'est assez logique et je peux travailler autour de
La projection dans mon exemple, est à la recherche d'MediaStore colonnes. Pour vérifier que vous avez besoin de faire une requête distincte pour les Paramètres Android fournisseur de contenu.
J'ai trouvé un moyen de vérifier si elle est disponible, mais je ne suis pas sûr si c'est la meilleure façon: developer.android.com/reference/android/content/... . si elle réussit, vous fermez la inputStream et vous pouvez supposer que la sonnerie peut être utilisé (à moins que quelqu'un supprime le fichier juste avant de l'utiliser), et si pas, le fichier a probablement été supprimé de son tracé d'origine. l'obtention de la sonnerie de la RingtoneManager ne veut pas dire que vous pouvez l'utiliser, le fichier peut avoir été supprimé après qu'il a obtenu à la DB.
Curseur cur = cr.query(Uri.parse(contentUri), la projection, null, null, null); jette l'autorisation refus d'exception.
OriginalL'auteur DeeV
De Kitkat vous le pouvez, et vous devez, persistent Uri que votre application utilise si nécessaire. Autant que je sache, il y a 128 URI limite tu peux persister par application, donc c'est à vous de maximiser l'utilisation de ces ressources.
Personnellement, je ne le traite pas avec des chemins d'accès direct dans ce cas, mais plutôt de vérifier si persisté URI existe toujours, depuis quand ressource (un fichier est supprimé à partir d'un périphérique, votre application perd les droits à cette URI, donc, que l'enregistrement d'aussi simple que la suivante:
En attendant, vous n'aurez pas besoin de vérifier pour URI autorisations lorsqu'un appareil est en dessous de Kitkat niveau API.
Généralement, lors de la lecture de fichiers à partir de l'Uri que vous allez utiliser
ParcelFileDescriptor
, donc il va jeter si aucun fichier n'est disponible que pour les URI, par conséquent, vous devriez envelopper avectry/catch
bloc.getPersistedUriPermissions()
semble sous-entendre que seuls les Uri déjà pris avectakePersistableUriPermission(Uri, int)
sont retournés, et cette liste n'est pas nécessairement mis à jour lorsqu'un ContentProvider supprime une ressource (mes tests sur Oreo porte ce cas d'utilisation).OriginalL'auteur Dragas
Moi aussi j'avais ce problème, j'ai vraiment envie de vérifier si un Uri était disponible avant d'essayer de le charger, inutile défaillances qui finissent par remplir mon Crashlytics journaux.
Depuis l'arrivée de la StorageAccessFramework (SAF), DocumentProviders, etc., traiter avec les Uri est devenue plus compliquée. C'est ce que j'ai finalement utilisé:
Si quelqu'un a plus d'élégance -- ou corriger -- alternative, merci de faire un commentaire.
OriginalL'auteur jules
Essayez d'une fonction comme:
OriginalL'auteur nkmuturi