web-dev-qa-db-fra.com

Jouer de la musique BG à travers les activités de Android

Bonjour! Première fois de poser une question ici à Stackoverflow. Excitant! Haha.

Nous développons un Android Jeu et nous jouons de la musique de fond pour notre intro (nous avons une activité d'introduction), mais nous voulons qu'il continue à jouer à la prochaine activité, et peut-être peut-être arrêter ou jouez à nouveau la musique de n'importe où dans l'application.

Ce que nous faisons en ce moment, c'est jouer au BGM à l'aide de MediaPlayer à notre activité d'introduction. Cependant, nous arrêtons la musique dès que l'utilisateur quitte cette activité. Devons-nous utiliser quelque chose comme des services pour cela? Ou est-ce que MediaPlayer/Soundpool est-il assez? Si quelqu'un connaît la réponse, nous apprécions volontiers votre partage avec nous. Merci!

31
jhie

Vous pouvez également créer un service qui joue de la musique à l'aide de MediaPlayer comme ci-dessous.

Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc); //OR stopService(svc); 

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
    MediaPlayer player;
    public IBinder onBind(Intent arg0) {

        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();


        player = MediaPlayer.create(this, R.raw.idil);
        player.setLooping(true); // Set looping
        player.setVolume(100,100);

    }
    public int onStartCommand(Intent intent, int flags, int startId) {


        player.start();

        return 1;
    }

    public void onStart(Intent intent, int startId) {
        // TODO



    }
    public IBinder onUnBind(Intent arg0) {
        // TODO Auto-generated method stub

        return null;
    }

    public void onStop() {

    }
    public void onPause() {

    }
    @Override
    public void onDestroy() {

        player.stop();
        player.release();
    }

    @Override
    public void onLowMemory() {

    }
}
9
Maneesh

Créez un SoundManager statique à l'aide des points de son ou des multidiffers.

Créez un drapeau statique appelé KeepMusicking.

Démarrez la musique lorsque la première activité est créée.

Lors de la mise sous tension, définissez Gardermusic avec true.

Lors de l'événement OnStop de vos activités, vérifiez si KeepMusicking est vrai, si oui, laissez la musique sur, puis définissez KISSIQUE à FALSE.

S'ils appuyent sur la touche HOME, le drapeau KeepMusicConce sera faux afin que la musique s'arrête lorsque l'activité perd la mise au point.

Email moi et je peux vous envoyer quelques points sonores que j'ai écrites un utilise MediaPlayers et les autres arguments sonores

Chadre

6
Chad

Si je comprends votre situation correctement, j'ai confronté le même problème plusieurs fois. J'utilise un fil différent pour jouer de la musique dans mes applications. Cette mise en œuvre transmet une référence statique à un contexte que je connais sera en vie pour que la musique soit jouée.

public class AudioPlayer extends Thread {
private Context c;
private Thread blinker;
private File file;

public AudioPlayer (Context c, File file) {
    this.c = c;
    this.file = file;
}

public void go () {
    blinker = this;
    if(!blinker.isAlive()) {
        blinker.start();
    }
}

public void end () {
    Thread waiter = blinker;
    blinker = null;
    if (waiter != null)
        waiter.interrupt ();
}

public void run () {
    MediaPlayer ap = MediaPlayer.create(c, Uri.fromFile(file));
    int duration = ap.getDuration();
    long startTime = System.currentTimeMillis();
    ap.start();
    try {
        Thread thisThread = Thread.currentThread();
        while (this.blinker == thisThread && System.currentTimeMillis() - startTime < duration) {           
            Thread.sleep (500);  // interval between checks (in ms)
        }
        ap.stop ();
        ap.release ();
        ap = null;
    } catch (InterruptedException e) {
        Log.d("AUDIO-PLAYER", "INTERRUPTED EXCEPTION");
        ap.stop ();
        ap.release();
        ap = null;
    }
    }
}
2
Shade

Vous pouvez essayer d'utiliser le asyncplayer mais vous devez conserver une référence à la classe afin d'arrêter le son de la lecture.

Vous pouvez créer une URI à une ressource locale à l'aide de Uri uri = Uri.parse("Android.resource://com.stackoverlof.Android/raw/ beep.mp3");.

J'espère que cela t'aides.

1
Jonas Van der Aa

D'abord, j'ai utilisé la méthode où conserver un drapeau "KeyMusicCaying" fourni par Tchad. Je pense que c'est plus élégant de simplement utiliser les méthodes Onstart et OnStop de vos activités.

Créer une propre classe " SoundManager " et appeler certaines classes onStart et onStop en elle de toutes vos activitées onStart et onStop (ou utiliser une classe d'activité de base). Gardez une trace de l'ONSTART et ONSTOP avec un StartCounter (DébutCounter ++ à Onstart et StartCounter-- à OnStop). Parce que le début d'une nouvelle activité est appelé avant l'onsetop de l'ancienne activité que vous savez toujours si l'OnStart est appelé pour la première fois (StartCounter == 1) ou commencé à partir d'une autre de vos activités (StartCounter == 2). Même avec l'onsetope (startcounter == 0 signifie que l'application était fermée, StartCounter == 1 signifie que c'est juste l'arrêt d'une vieille activité, mais il y a une nouvelle).

De cette façon, vous encapsulez tout dans votre SoundManager au lieu d'avoir à appeler une méthode/drapeau de KeyMusicClaying sur chaque activité Démarrer dans votre application.

    public void OnStart()
    {
        startCounter++;
        if (startCounter == 1)
        {
            //start music here
        }

    public void OnStop()
    {
        startCounter--;
        if (startCounter == 0)
        {
            // stop music here
        }
    }
1
Kedu