MediaPlayer setDataSource a échoué avec l'état=0x80000000 pour la Sonnerie définie par filepath sur 2.3.4
Titre dit la plupart.
Ma demande a été jouer à des sonneries souligné par des uri comme content://media/internal/audio/media/387
ou content://media/external/audio/media/1655
(pour les sonneries personnalisées sur SDcard je crois) à l'aide de deux setDataSource(fileInfo)
et setDataSource(mContext, Uri.parse(fileInfo))
.
Dans chaque cas, j'ai reçu les journaux avec des informations sur setDataSource failed.: status=0x80000000
exception sur les téléphones Android 4.x (versions différentes).
De voir que l'erreur ne se produit que pour les sonneries pointé par le contenu uri, mais pas à des fichiers uniques pointé par le chemin, j'ai décidé d'utiliser des chemins d'accès pour les sonneries, aussi, correction d'un problème sur les téléphones (bien que toujours à l'aide de setDataSource(mContext, Uri.parse(fileInfo))
)
Il a toutefois commencé problèmes sur les téléphones avec Android 2.3.4-2.3.6 (pas sur le mien 2.3.3 tout de même):
- J'ai reçu quelques journaux, à l'exception:
setDataSource failed.: status=0x80000000
pour les fichiers avec les chemins comme/system/media/audio/ringtones/TwirlAway.ogg
-
J'ai aussi reçu un journal sur
MediaPlayer.onErrorListener.onError(int what, int extra)
appel de méthode avecwhat=1
etextra=-2147483648
, qui, d'après ce que je sais, suggèrent soit que le fichier est manquant ou qu'il est corrompu. Cependant j'ai effectuerFile file = new File(fileInfo); if (!file.exists())
vérifier dans une telle situation, et il est revenu que le fichier n'existe pas - est-il corrompu alors? Très peu probable pour le fichier de musique dans la mémoire interne.
Pour résumer:
- fonctionne avec
setDataSource("content://media/internal/audio/media/52")
- throws exception:
setDataSource failed.: status=0x80000000
poursetDataSource(mContext, "/system/media/audio/ringtones/TwirlAway.ogg")
Fait intéressant, les premières lignes de setDataSource(Context context, Uri uri, Headers headers)
méthode qui est appelée par setDataSource(Context context, Uri uri)
sont (de GrepCode source pour 2.3.4):
String scheme = uri.getScheme();
if(scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
return;
}
Donc, après tout, il ne parvient pas pour setDataSource("/system/media/audio/ringtones/TwirlAway.ogg")
. J'ai pris des chemins d'accès à des sonneries à partir de l'uri en utilisant:
private static String getRingtonePathFromContentUri(Context context,
Uri contentUri) {
String[] proj = { MediaStore.Audio.Media.DATA };
Cursor ringtoneCursor = context.getContentResolver().query(contentUri,
proj, null, null, null);
ringtoneCursor.moveToFirst();
return ringtoneCursor.getString(ringtoneCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
}
Les idées de ce que peut être la cause de l'erreur de jeter? Peut-être que ceux qui sont certains des problèmes causés par le manque de lecture des autorisations?
Je suppose que le code source natif setDataSource(String path) fonction serait d'une grande aide, mais je n'étais pas capable de le trouver.
Vous devez vous connecter pour publier un commentaire.
Réponse par Lorne ci-dessous a été le plus utile pour traiter ce problème.
Pour quelqu'un d'autre aux prises avec elle, voici le code que j'ai utilisé pendant plus de 6 mois maintenant avec des erreurs presque pas signalé plus.
fileinfo
peut être à la fois de ci-dessous (exemples):/system/media/audio/alarms/Walk_in_the_forest.ogg
content://media/internal/audio/media/20
Il y avait un changement dans le comportement de
setDataSource(String path)
en raison d'une correction de bug sous Android 4.1.1. En 4.1.1 ou tard, vous devez utiliser un chemin d'accès local (sans protocole). Cependant, sur 4.0.4 et plus tôt vous avez besoin pour utiliser un URI (par exemple avec le protocole file://).Ici est incomplète extrait de code qui devrait illustrer la solution de contournement:
Vous avez explicite de l'ensemble de la longueur de votre fichier. Utiliser la méthode surchargée:
AssetFileDescriptor afd = ctx.getAssets().openFd([your asset name]);
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
Cela peut être dû au fait que le format de fichier que vous essayez de lire ou de les compresser. J'ai été compresser un fichier mp4 qui fonctionne bien mais quand je compresse un fichier mov la demande s'est écrasé en donnant la setDataSource exception d'échec.
J'ai eu le même message d'erreur, quand j'ai essayé de jouer un .fichier wav. Permet de faire un exemple:
Moi aussi j'ai eu le statut=0x80000000 erreur. Dans mon cas, la solution a été de ré-encoder le fichier audio (par exemple, pour PCM 16 BITS pour un .fichier wav) et tout a fonctionné comme prévu.
Vous ne pouvez pas le faire, parce que préparer a été appelé à créer la fonction, donc vous ne pouvez pas modifier le Flux Audio de Type après.
Code ci-dessous est a bien fonctionné pour moi: