Problèmes avec MediaPlayer, ressources brutes, arrêt et démarrage

Je suis nouveau au développement Android et j'ai une question/problème.

je joue avec la classe MediaPlayer pour reproduire des sons / de la musique. Je suis à jouer à des ressources premières (res/raw) et ça a l'air assez facile.

pour jouer une ressource brute, le MediaPlayer doit être initialisé comme ceci:


MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song);
mp.start();

Jusqu'ici, il n'y a pas de problème. Le son est joué, et tout fonctionne bien. Mon problème apparaît lorsque je veux ajouter plus d'options à ma demande. Spécifiquement quand j'ajoute le bouton/l'option" Stop".

Fondamentalement, ce que je veux faire est...lorsque j'appuie sur "Stop", la musique s'arrête. Et quand j'appuie sur "Start", la chanson/son recommence. (assez basique!)

Pour arrêter le lecteur multimédia, vous n'avez qu'à appeler stop(). Mais pour jouer le son de nouveau, le lecteur multimédia doit être réinitialisé et préparé.


mp.reset();
mp.setDataSource(params);
mp.prepare();

Le problème est que la méthode setDataSource() accepte seulement comme paramètre un fichier chemin, URI du fournisseur de contenu, chemin D'URL du média de streaming, ou descripteur de fichier.

Donc, puisque cette méthode ne pas accepter un identificateur de ressource, je ne sais pas comment définir la source de données afin d'appeler prepare(). En outre, Je ne comprends pas pourquoi vous ne pouvez pas utiliser un identifiant de ressource pour définir la source de données, mais vous pouvez utiliser un identifiant de ressource lors de L'initialisation du MediaPlayer.

je suppose que je rate quelque chose. Je me demande si je suis un mélange des concepts et de la méthode stop() ne doit pas être appelé dans le bouton "Stop". Toute aide?

Merci d'avance!!!

24
demandé sur Deepzz 2010-06-03 23:47:32
la source

6 ответов

voici ce que j'ai fait pour charger plusieurs ressources avec un seul Médiaplayer:

/**
 * Play a sample with the Android MediaPLayer.
 *
 * @param resid Resource ID if the sample to play.
 */
private void playSample(int resid)
{
    AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);

    try
    {   
        mediaPlayer.reset();
        mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
        mediaPlayer.prepare();
        mediaPlayer.start();
        afd.close();
    }
    catch (IllegalArgumentException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IllegalStateException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }
    catch (IOException e)
    {
        Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
    }

mediaPlay est une variable membre qui est créée et libérée à d'autres points de la classe. Ce n'est peut-être pas la meilleure façon (je suis nouveau à Android moi-même), mais il semble à travailler. Notez juste que le code tombera probablement au bas de la méthode avant que le médiaplayer n'ait fini de jouer. Si vous avez besoin de jouer une série de ressources, vous aurez toujours besoin pour gérer ce cas.

27
répondu adstro 2010-08-30 22:31:56
la source

c'est de cette façon MediaPlayer.créer méthode fonctionne pour ouvrir un fichier raw:

    public static MediaPlayer create(Context context, int resid) {
         try {
             AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
             if (afd == null) return null;

             MediaPlayer mp = new MediaPlayer();
             mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
             afd.close();
             mp.prepare();
            return mp;
        } catch (IOException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        } catch (IllegalArgumentException ex) {
            Log.d(TAG, "create failed:", ex);
           // fall through
        } catch (SecurityException ex) {
            Log.d(TAG, "create failed:", ex);
            // fall through
        }
         return null;
    }
15
répondu mishkin 2013-01-14 11:50:39
la source

Ou, vous pouvez accéder à la ressource de cette façon:

mediaPlayer.setDataSource(context, Uri.parse("android.resource://com.package.name/raw/song"));

où com.paquet.nom est le nom de votre dossier de candidature

9
répondu petrica.martinescu 2015-05-06 11:51:29
la source

Vous pouvez utiliser

mp.pause();
mp.seekTo(0);

pour arrêter le lecteur de musique.

4
répondu Rectangle 2013-01-14 11:50:44
la source

enfin, la façon dont ça marche pour moi:

public class MainStart extends Activity {

    ImageButton buttonImage;
    MediaPlayer mp;
    Boolean playing = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);

        buttonImage = (ImageButton)findViewById(R.id.ButtonID);


        buttonImage.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                if(playing){
                    mp.stop();
                    playing = false;
                }else{
                    mp = MediaPlayer.create(getApplicationContext(), R.raw.sound_u_want);
                    mp.start();
                    playing = true;
                }
            }
        });
    }
}
3
répondu MarcBilbo 2012-07-22 14:46:14
la source

M. Rectangle, ce message peut-être trop tard pour lui, mais j'écris fièrement ces codes à votre idée: j'ai mpmediaplayer et sescal9 est un button.

....
if(btnClicked.getId() == sescal9_ornek_muzik.getId())
        {
            mp.start();
            mp.seekTo(380);
            mp2.start();
            mp2.seekTo(360);
            mp3.start();
            mp3.seekTo(340);
            ...
            }
0
répondu Bay 2013-09-16 15:40:17
la source

Autres questions sur