web-dev-qa-db-fra.com

Android: lire un fichier mp3 à partir d'une ressource brute en cliquant sur TextView

Salut les gars, je veux lire un certain fichier mp3 quand un texte est cliqué. Par exemple, j'ai cliqué sur le mot "Nicolas", l'application doit jouer à nicholas.mp3 ...

Désolé pour mon code désordonné, je suis nouveau sur Android dev:

package com.example.playword;

import Java.io.IOException;

import Android.app.Activity;
import Android.media.MediaPlayer;
import Android.os.Bundle;
//import Android.os.Handler;
import Android.view.View;
//import Android.view.View.OnClickListener;
//import Android.widget.Button;
import Android.widget.TextView;

public class PlayWord extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //final Handler mHandler = new Handler();

        final TextView nicholas = (TextView) findViewById(R.id.nicholas);
        final TextView was = (TextView) findViewById(R.id.was);

        nicholas.setText("Nicholas ");
        was.setText("was ");        

        /*
        Button btn = (Button) (findViewById(R.id.nicholasBtn));

        btn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                nicholas.setText("Nicholas (Clicked!) ");
            }

          });
        */

        View.OnClickListener handler = new View.OnClickListener(){
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.nicholas: // doStuff

                        MediaPlayer mPlayer = MediaPlayer.create(null, R.raw.aaanicholas);

                        try {
                            mPlayer.prepare();
                        } catch (IllegalStateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        mPlayer.start();

                        nicholas.setText("Nicholas (Clicked!) ");
                        break;

                    case R.id.was: // doStuff

                        MediaPlayer mPlayer1 = MediaPlayer.create(null, R.raw.aaawas);

                        try {
                            mPlayer1.prepare();
                        } catch (IllegalStateException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        mPlayer1.start();

                        was.setText("was (Clicked!) ");
                        break;
                }
            }
        };

        findViewById(R.id.nicholas).setOnClickListener(handler);
        findViewById(R.id.was).setOnClickListener(handler);

    }
}

Lorsque je lance ceci, j'obtiens une erreur de fermeture forcée. Avez-vous une bien meilleure idée à ce sujet? Merci d'avance!

23
Kris

Vous devez passer une instance de contexte dans la méthode MediaPlayer.create :

MediaPlayer mPlayer = MediaPlayer.create(PlayWorld.this, R.raw.aaanicholas);

De plus, après l'appel à create(), prepare est déjà exécuté, vous n'avez donc pas besoin de l'exécuter explicitement, il suffit d'appeler start() juste après create().

53
Konstantin Burov

Lorsque vous créez l'objet mPlayer, vous devez lui passer le contexte, qui est dans votre cas PlayWord.this.

4
MByD
MediaPlayer mPlayer = MediaPlayer.create(FakeCallScreen.this, R.raw.mysoundfile);
    mPlayer.start();