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 avec what=1 et extra=-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 effectuer

    File 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 pour setDataSource(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.

InformationsquelleAutor Koger | 2013-05-06