Lier choix Spinner et Lyrics au MediaPlayer

Résolu/Fermé
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 - Modifié le 29 août 2018 à 19:09
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 - 30 août 2018 à 18:03
Bonjour à tous et à toutes ! ="D

Alors voilà, je développe une "App" test via Android Studio qui n'est rien d'autre qu'un lecteur Audio (avec Lyrics + Spinner en haut pour sélectionner la musique)
et après avoir parcouru bon nombre de Tutos Youtube et de site internet pour trouver la méthode à suivre, je n'ai pas trouver comment (dans MainActivity)
lier les différents choix de musique (Spinner) au lecteur audio ainsi que l'affichage des Lyrics de la chanson sélectionner.


Voici une capture d'écran de l'App (MainActivity) :


Ainsi que le code MainActivity:
package be.umwami.looply;
 
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
 
 
public class MainActivity extends AppCompatActivity {
 
    //Spinner
    Spinner spinner;
    int currentItem = 0;
 
 
 
    //Eléments de l'activitée
    Button playBtn;
    SeekBar positionBar;
    SeekBar volumeBar;
    TextView elapsedTimeLabel;
    TextView remainingTimeLabel;
    MediaPlayer mp;
    int totalTime;
 
 
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        spinner = (Spinner)findViewById(R.id.spinner);
 
 
 
 
 
        //Paramètres Musique
        playBtn = (Button) findViewById(R.id.playBtn);
        elapsedTimeLabel = (TextView) findViewById(R.id.elapsedTimeLabel);
        remainingTimeLabel = (TextView) findViewById(R.id.remainingTimeLabel);
 
        // Media Player
        mp = MediaPlayer.create(this, R.raw.queen_mama);
        mp.setLooping(true);
        mp.seekTo(0);
        mp.setVolume(1f, 1f);
        totalTime = mp.getDuration();
 
        // Position Bar
        positionBar = (SeekBar) findViewById(R.id.positionBar);
        positionBar.setMax(totalTime);
        positionBar.setOnSeekBarChangeListener(
                new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                        if (fromUser) {
                            mp.seekTo(progress);
                            positionBar.setProgress(progress);
                        }
                    }
 
                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {
 
                    }
 
                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
 
                    }
                }
        );
 
 
        // Volume Bar
        volumeBar = (SeekBar) findViewById(R.id.volumeBar);
        volumeBar.setOnSeekBarChangeListener(
                new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                        float volumeNum = progress / 100f;
                        mp.setVolume(volumeNum, volumeNum);
                    }
 
                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {
 
                    }
 
                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
 
                    }
                }
        );
 
        // Thread (Update positionBar & timeLabel)
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (mp != null) {
                    try {
                        Message msg = new Message();
                        msg.what = mp.getCurrentPosition();
                        handler.sendMessage(msg);
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {}
                }
            }
        }).start();
 
    }
 
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            int currentPosition = msg.what;
            // Update positionBar.
            positionBar.setProgress(currentPosition);
 
            // Update Labels.
            String elapsedTime = createTimeLabel(currentPosition);
            elapsedTimeLabel.setText(elapsedTime);
 
            String remainingTime = createTimeLabel(totalTime-currentPosition);
            remainingTimeLabel.setText("- " + remainingTime);
        }
    };
 
    public String createTimeLabel(int time) {
        String timeLabel = "";
        int min = time / 1000 / 60;
        int sec = time / 1000 % 60;
 
        timeLabel = min + ":";
        if (sec < 10) timeLabel += "0";
        timeLabel += sec;
 
        return timeLabel;
    }
 
    public void playBtnClick(View view) {
 
        if (!mp.isPlaying()) {
            // Stopping
            mp.start();
            playBtn.setBackgroundResource(R.drawable.stop);
 
        } else {
            // Playing
            mp.pause();
            playBtn.setBackgroundResource(R.drawable.play);
        }
 
    }
}


Merci d'avance pour votre aide

PS : Touts les fichiers audio, lyrics sont dans l'application (Audio dans "raw" et lyrics dans....Je ne sais pas encore où les mettre).
Et bien sur les musiques afficher sur la photo ne sont pas dans l'App (Droits d'auteur), ce ne sont que des exemples.

2 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
30 août 2018 à 09:01
Hello,

Quel est ton problème exactement ?
- Afficher des valeurs dans ton Spinner ?
- Récupérer la valeur sélectionnée ?
- Stocker tes fichiers ?
- Jouer tes fichiers ?
0
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
Modifié le 30 août 2018 à 09:36
Bonjour BrunoCS, merci pour votre réponse,

Alors oui, petit rappel du fonctionnement de l'App :

Sélection de la chanson via la liste dans le Spinner, affichage des Lyrics en fonction de la chanson et chargement de la musique dans le MediaPlayer.

Ma question :
Comment faire en sorte que quand je sélectionne une musique dans le Spinner, les paroles s'affichent (au milieu de l'ecran) et la musique se charge dans le MediaPlayer tout simplement.


PS : Je sais que c'est simple à faire mais je suis un novice en la matière. J'ai beau chercher le code à mettre dans MainActivity.java dans des Tutos, Forums...etc mais je ne trouve pas.

Encore merci pour vos réponses BrunoCS.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
30 août 2018 à 09:59
Alors, il te faut:

- un listener sur ton Spinner pour connaître le changement de sélection
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // ton code ici
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // ton code ici
    }
});


- un mapping pour associer telle musique avec tels lyrics. Tu peux créer par exemple une liste d'objet
Music
:

public class Music {
  String mTitle;  // Titre de la musique
  int mResMusicId; // ID de la ressource musicale
  int mResLyricsId; // ID de la ressource lyrics
}

Cet objet va permettre d'alimenter ton Spinner.

- une
TextView
pour afficher le texte des lyrics. Peut-être prévoir une
ScrollView
si le texte est trop long....
0
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
Modifié le 30 août 2018 à 10:43
au niveau du setOnItemSelectedListener , je comprend que c'est là que je met ce qui va se passer lorsque je vais appuyer sur un Item dans le Spinner, mais étant donner que j'ai 220 musiques à mettre, dois-je faire une sorte de "case" partant de la position 0 à 219 ? en mentionnant dans chaque "case" l'id de la musique à charger dans le MediaPlayer et les Lyrics à afficher ?

Je suis assez à l'aise avec le XML mais j'ai un réel souci avec la structure dans le MainActivity, je sais que c'est une évidence pour vous et je m'en excuse ="/
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
30 août 2018 à 11:00
Le point 2 que je t'ai décrit va t'éviter un grand switch..case inutile : Il faut que tu construise ton mapping pour avoir une liste d'objets. Ensuite, quand tu sélectionne une valeur dans le spinner, tu reçois la position de l'objet. Il te sera donc facile de récupérer les données associées.
0
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
Modifié le 30 août 2018 à 11:12
reçu 5/5 !

Je viens d'essayer ceci (Oui je raisonne en C++ haha) mais ca n'as rien donner :

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

spinner = (Spinner)findViewById(R.id.spinner_chansons);

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {

if(position==0){
mp.setDataSource(R.raw.queen_mama);
}

if(position==1) {
mp.setDataSource(R.raw.eurythmics_sweet_dreams);
}

}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {

}



Je vais tester votre dernier conseil, à tout à l'heure. =")
0
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
30 août 2018 à 11:22
Comme ce ci ? :

 spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

public class Music {
String mTitle;  
 int mResMusicId; 
 int mResLyricsId; 
 }
 }

@Override
public void onNothingSelected(AdapterView<?> parentView) {
return;
}
}); 
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
30 août 2018 à 11:25
Alors, non. On ne définit pas une classe à l'intérieur d'une méthode.
Je vois ça plutôt dans un Singleton externe, ou bien ou démarrage de ton Activity
0