web-dev-qa-db-fra.com

Problèmes avec MediaPlayer, ressources brutes, arrêter et démarrer

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

Je joue avec la classe MediaPlayer pour reproduire certains sons/musiques. Je suis en train de jouer aux ressources brutes (res/raw) et ça a l'air facile.

Pour lire une ressource brute, le MediaPlayer doit être initialisé comme suit:


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 souhaite ajouter d'autres options à mon application. Spécifiquement quand j'ajoute le bouton/l'option "Stop".

En gros, ce que je veux faire, c’est ... lorsque je 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, il suffit d'appeler stop(). Mais pour reproduire le son, 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 uniquement en tant que paramètres un chemin de fichier, un URI de fournisseur de contenu, un chemin d’URL de contenu multimédia en continu ou un descripteur de fichier.

Donc, comme cette méthode n’accepte pas d’identifiant de ressource, je ne sais pas comment définir la source de données pour appeler prepare(). De plus, je ne comprends pas pourquoi vous ne pouvez pas utiliser d'identifiant Resouce pour définir la source de données, mais vous pouvez utiliser un identifiant de ressource lors de l'initialisation de MediaPlayer.

Je suppose que je manque quelque chose. Je me demande si je mélange des concepts et si la méthode stop() n'a pas à être appelée dans le bouton "Arrêter". De l'aide?

Merci d'avance!!!

24
arakn0

Voici ce que j'ai fait pour charger plusieurs ressources avec un seul MediaPlayer:

/**
 * 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 créée et publiée à d'autres moments de la classe. Ce n'est peut-être pas la meilleure solution (je suis nouveau sur Android), mais cela semble fonctionner. Il suffit de noter que le code tombera probablement au bas de la méthode avant la lecture du lecteur multimédia. Si vous devez jouer une série de ressources, vous devrez tout de même gérer ce cas.

27
adstro

voici comment MediaPlayer.create method 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
mishkin

Ou, vous pouvez accéder à la ressource de cette manière:

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

où com.package.name est le nom de votre package d'application

9
petrica.martinescu

Vous pouvez utiliser 

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

arrêter le lecteur de musique.

4
Rectangle

Enfin, la façon dont cela fonctionne 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
MarcBilbo

M. Rectangle, ce message est peut-être trop tard, mais j’écris ces codes avec fierté pour votre idée: j’ai mp pour mediaplayer 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
Bay