web-dev-qa-db-fra.com

Android MediaPlayer - erreur (1, -4) lors de la lecture d'une chanson

J'essaie de lire un fichier audio mp3 à partir de la carte SD en utilisant le chemin d'accès et le nom du fichier audio pour obtenir son Uri.

J'ai une Spinner remplie avec les noms de pistes stockés dans la carte SD. Quand un élément est sélectionné, le code suivant sera exécuté:

final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
OnItemSelectedListener listener = new OnItemSelectedListener(){
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            TextView tv = (TextView) selectedItemView;

            File file = new File(uri.getPath() + "/" + tv.getText().toString());
            Log.i(TAG, "-------------  PATH : " + file.getAbsolutePath());
            Uri uri = Uri.fromFile(file);
            MediaPlayer mP = new MediaPlayer();
            try {
                mP.setDataSource(context, uri);

                mP.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.start();

                    }
                });

            } catch (IllegalArgumentException e) {
                  e.printStackTrace();
            } catch (IllegalStateException e) {
              e.printStackTrace();
            } catch (IOException e) {
              e.printStackTrace();
            }
            try {
                mP.prepare();
            } catch (IllegalStateException e) {
              e.printStackTrace();
            } catch (IOException e) {
             e.printStackTrace();
            }

        }
    };

Je reçois les erreurs suivantes:

08-21 16:16:37.099: I/MusicFileActivity(3940): -------------  PATH : /external/audio/media/antazirouka
08-21 16:16:37.159: W/MediaPlayer(3940): info/warning (1, 26)
08-21 16:16:37.159: E/MediaPlayer(3940): error (1, -4)
08-21 16:16:37.159: W/System.err(3940): Java.io.IOException: Prepare failed.: status=0x1
08-21 16:16:37.169: W/System.err(3940):     at Android.media.MediaPlayer.prepare(Native Method)
08-21 16:16:37.169: W/System.err(3940):     at com.example.project.MusicFileActivity$1.onItemSelected(MusicFileActivity.Java:84)
08-21 16:16:37.169: W/System.err(3940):     at Android.widget.AdapterView.fireOnSelected(AdapterView.Java:871)
08-21 16:16:37.169: W/System.err(3940):     at Android.widget.AdapterView.access$200(AdapterView.Java:42)
08-21 16:16:37.169: W/System.err(3940):     at Android.widget.AdapterView$SelectionNotifier.run(AdapterView.Java:837)
08-21 16:16:37.169: W/System.err(3940):     at Android.os.Handler.handleCallback(Handler.Java:587)
08-21 16:16:37.169: W/System.err(3940):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
08-21 16:16:37.169: W/System.err(3940):     at Android.os.Looper.loop(Looper.Java:123)
08-21 16:16:37.169: W/System.err(3940):     at Android.app.ActivityThread.main(ActivityThread.Java:3687)
08-21 16:16:37.169: W/System.err(3940):     at Java.lang.reflect.Method.invokeNative(Native Method)
08-21 16:16:37.169: W/System.err(3940):     at Java.lang.reflect.Method.invoke(Method.Java:507)
08-21 16:16:37.169: W/System.err(3940):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:867)
08-21 16:16:37.169: W/System.err(3940):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:625)
08-21 16:16:37.169: W/System.err(3940):     at dalvik.system.NativeStart.main(Native Method)

Est-ce que quelqu'un a une idée à ce sujet? Merci d'avance :)

8
Hanady

Mec tu as placémP.prepare();sur la mauvaise ligne Tu dois l'appeler aprèsmP.setDataSource(context, uri);function Et avantmp.start();

Aussi, n'essayez pas de créer plusieurs instances de MediaPlayer . Faites-en un et utilisez reset () function à chaque fois avant de commencer.

S'il vous plaît voir ce lien pour plus d'aide. 

12
TheLittleNaruto

Avez-vous cette permission dans AndroidManifest.xml?

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
1
tim.paetz

Incrorecter le nom du fichier ou le chemin du fichier qui a défini in.setDataSource(fileName).

Ou mauvais appel .prepare() (DOIT APPELER .setDataSource() before .prepare()) .Voir la réponse @TheLittleNaruto.

0
Fortran