SVP ! Spinner onItemSelected ==> MediaPlayer

Résolu/Fermé
Signaler
Messages postés
139
Date d'inscription
mercredi 29 août 2018
Statut
Membre
Dernière intervention
6 septembre 2018
-
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
-
Bonjour à tous et toutes ! ="D

Cela fait maintenant 4 jours que je suis bloquer avec ce Mystère ! ="(
Je recherche la méthode pour lier les différents choix du Spinner au MediaPlayer tout simplement.

SVP évitez les subtilités de code ou les demi réponse car je suis un pure novice et je ne risque pas de trouver par magie x"D. J'ai littéralement chercher PARTOUT ! comme un acharné : Tutos, Forums et autres.

Aujourd'hui j'ai eu l'idée de jeter un coup d'oeil sur GitHub afin de chercher des codes source (open source) de Lecteur Audio qui utilisent un Spinner tout comme mon App afin de trouver cette méthode mais à chaque fois c'est
==> MediaPlayer + .mp3 sur Carte SD ou encore MediaPlayer + Button en ListView pffff... <="(


Voici le XML :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/fond_voxov1"
    tools:context=".MainActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="270dp"
            android:layout_weight="1"
            android:gravity="center_vertical|center_horizontal"
            android:orientation="horizontal">

            <Spinner
                android:id="@+id/spinner_pays"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:background="@drawable/back_btn"
                android:scrollbarSize="10dp"
                android:popupBackground="@color/transparent1"
                android:layout_weight="1"
                android:entries="@array/pays"
                android:textAlignment="center" />


        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="500dp"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:orientation="horizontal">


            <ScrollView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:background="@drawable/text_logo">

            </ScrollView>

        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="333dp"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:orientation="vertical">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/elapsedTimeLabel"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="30dp"
                    android:layout_weight="0"
                    android:text="0:11" />

                <TextView
                    android:id="@+id/remainingTimeLabel"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="240dp"
                    android:layout_weight="0"
                    android:text="-1:49" />

            </LinearLayout>




            <SeekBar
                android:id="@+id/positionBar"
                android:layout_width="300dp"
                android:layout_height="wrap_content"/>


            <Button
                android:id="@+id/playBtn"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:background="@drawable/play"
                android:layout_marginTop="10dp"
                android:onClick="playBtnClick" />



            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center">

                <ImageView
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:layout_marginTop="10dp"
                    android:src="@drawable/sound"
                    android:layout_marginLeft="20dp" />

                <SeekBar
                    android:id="@+id/volumeBar"
                    android:layout_width="250dp"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="25dp"
                    android:layout_marginVertical="15dp"
                    android:max="100"
                    android:progress="50" />

                <ImageView
                    android:layout_width="25dp"
                    android:layout_height="25dp"
                    android:layout_marginTop="10dp"
                    android:src="@drawable/sound2"/>

            </LinearLayout>

            </LinearLayout>

    </LinearLayout>

</LinearLayout>




Le MainActivity :
package be.umwami.looply;

import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;

import java.io.File;
import java.io.FileReader;
import java.sql.ResultSet;

import static android.media.CamcorderProfile.get;


public class  MainActivity extends AppCompatActivity {

    //Spinner
    Spinner spinner_pays;
    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_pays = (Spinner)findViewById(R.id.spinner_pays);




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


???????????????????????????????????????????????????????????????????????????????????????????


            }

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

            }
        });







        //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.afghanistan);
        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);
        }

    }
}



Et enfin le strings.xml où vont se trouver les noms des choix (Spinner) :
<resources>
    <string name="app_name">looply</string>

    <string-array name="pays">
        <item>Afghanistan</item>
        <item>Afrique du Sud</item>
        <item>Albanie</item>
    </string-array>
</resources>



Un Giga merci d'avance à celle ou celui qui aura la gentillesse de m'aider ! ❤ ="D

6 réponses

Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
Re,

Avant de pouvoir (continuer à) t'aider, nous avons besoin de savoir :
- que veux-tu mettre dans ton Spinner
- que veux-tu mettre dans ton String-Array
- où sont stockés tes fichiers mp3
- où sont stockés tes fichiers lyrics
0
Messages postés
139
Date d'inscription
mercredi 29 août 2018
Statut
Membre
Dernière intervention
6 septembre 2018
140
Hallelujaaaaah ! Enfin une réponse, ça fait du bien ="D


Re BrunoCS !

1. seulement des noms de Pays
2. les noms de ces Pays
3. les mp3 sont dans l'App (raw)
4. je ne sais pas où l'on stock des fichiers texte
0
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
1. seulement des noms de Pays
2. les noms de ces Pays
-> ok, donc ça, je crois que c'est bon

3. les mp3 sont dans l'App (raw)
-> ok

4. je ne sais pas où l'on stock des fichiers texte
-> dans le répertoire raw aussi, si tu veux.
0
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
Maintenant que nous savons cela, quelques questions :

Comment sont liées tes données ?
Que doit-il se passer lorsque tu sélectionne un pays dans ton Spinner ?
0
Messages postés
139
Date d'inscription
mercredi 29 août 2018
Statut
Membre
Dernière intervention
6 septembre 2018
140
En fait ca fonctionne un peut comme un simple lecteur de musique avec sa playlist et le milieu de l'écran pour les Lyrics.

Voici un "schéma" :


Pour faire simple, les Lyrics (ScrollView) et le MediaPlayer dépendent du "Choix Spinner".

0
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
Donc c'est une musique par pays ?
0
Messages postés
139
Date d'inscription
mercredi 29 août 2018
Statut
Membre
Dernière intervention
6 septembre 2018
140
Exactement !

Une musique, Un Lyrics ===> Un pays
0
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
Donc lorsque tu sélectionnes un pays dans le spinner, tu veux jouer une musique et une lyric associée. Right ? Comment fais-tu le lien entre ces 3 éléments ?
0
Messages postés
139
Date d'inscription
mercredi 29 août 2018
Statut
Membre
Dernière intervention
6 septembre 2018
140
Voilà et c'est là que je coince, j'ai pleinement conscience que c'est à cette partie du code que cela ce passe :
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spinner_pays = (Spinner)findViewById(R.id.spinner_pays);




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


            !!!!!!!!!!!!!!!!!     ICI  ICI   ICI  ICI  ICI   ICI      !!!!!!!!!!!!!!!!!


            }

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

            }
        });


Avec OnItemSelected et en ayant initialiser "l'Adaptater" mais ca fait 1 mois et quelques que j'ai commencer le langage Java via tutos et autres du coup je ne sais vraiment pas.

Dans ma tête c'est tout fait en "C++" (j'improvise haha) :

if (Choix == 0) {
     - afficher les Lyrics de "txt_afghanistant.txt" dans la ScrollView;
     - charger la musique "Afghanistan.mp3" dans le MediaPlayer;
     - préparer le MediaPlayer à être lancer;
} else if (Choix ==1) {
              - afficher les Lyrics de "txt_afrique_du_sud.txt" dans la ScrollView;
              - réinitialiser MediaPlayer (sinon le lecteur va bugger je pense);
              - charger la musique "afrique_du_sud.mp3" dans le MediaPlayer;
              - préparer le MediaPlayer à être lancer;
} else if (Choix ==2) {    
              - .... etc     


Et encore... Ça n'as pas l'air très juste ="d
0
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
Je t'ai déjà passé un pseudo algo mais tu ne me dis pas ce qui ne va pas, ce qui bloque, etc. Je t'ai également dit que ta cascade de
if
est inutile si tu initialises correctement tes données.

Voici encore un exemple:

public class MainActivity extends AppCompatActivity {
    // déclaration des 3 sources de données.
    // Attention !  Elles doivent être remplies dans le même ordre
    String[] mCountries;  // liste des pays
    Int[] mMusicResources = {R.raw.musicFr, R.raw.musicEn};  //liste des fichiers musicaux, à compléter
    Int[] mLyricsResources = {R.raw.lyricsFr, R.raw.lyricsEn};  //liste des lyrics, à compléter

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

        // récupération de la liste des pays
        mCountries = getResources().getStringArray(R.array.countries);    

        // déclaration du spinner
        spinner_pays = (Spinner)findViewById(R.id.spinner_pays);
        spinner_pays.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {

              // ici, position correspond à l'index sélectionné. Si tout est bien rangé, tu sais que:
              // mCountries[position] est le pays sélectionné
              // mMusicResources[position] est l'ID du fichier musical à jouer
              // mLyricsResources[position] est l'ID du fichier de lyrics à afficher

              // lecture du fichier musical
              MediaPlayer player = MediaPlayer.create(this, mMusicResources[position]);
              player.start();

              // affichage des lyrics (à adapter suivant ton besoin)
              displayLyrics(mLyricsResources);
            }

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

            }
        });
    }

    void displayLyrics(int resID) {
              InputStream inputStream = getResources().openRawResource(resID);
              BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
              String line;
              StringBuilder text = new StringBuilder();

              try {
                  while (( line = buffreader.readLine()) != null) {
                      text.append(line);
                      text.append('\n');
                  }
              } catch (IOException e) {
                // TODO
              }

              textView.setText(text.toString());
    }
}

0
Messages postés
139
Date d'inscription
mercredi 29 août 2018
Statut
Membre
Dernière intervention
6 septembre 2018
140
Bonjour BrunoCS ! Vous passez une bonne journée j'espère ? ="D


I'm ready ! LET'S GO !!!



Bon ! A savoir, mon dossier raw est comme ceci de base :


Alors, pour suivre le raisonnement de la déclaration des 3 ressources, j'ai ranger le dossier raw comme ceci :



Mais cela reste en rouge, ce qui n'est pas logique :


De plus j'ai ces éléments en rouge :


Ici j'ai essayer de suivre vos instructions pour le "onItemSelected :


Please, dites-moi que je suis sur la bonne voix ?





0
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
Alors,

1. tu ne peux pas hiérarchiser tes données dans le dossier raw. C'est "en vrac"
2. pour les erreurs, il faut regarder les message que tu obtiens. Mais, a priori:
  • pour le 1er, il ne faut pas passer
    this
    (car tu es dans une callback) mais
    MainActivity.this
    .
  • pour le 2e, tu passes un tableau en paramètre alors qu'il attend un
    int
    . Attention aussi à ne pas déclarer une méthode à l'intérieur d'une autre méthode
  • pour le 3e, c'est normal :
    buffreader
    n'existe pas. C'est plutôt
    reader
    qu'il faut mettre

3. un peu de réflexion, que diable !
position
est un
int
!! Tu ne peux pas utiliser de méthode dessus ! Je t'ai montré comment récupérer les données stockés dans raw
0
Messages postés
139
Date d'inscription
mercredi 29 août 2018
Statut
Membre
Dernière intervention
6 septembre 2018
140
1. dossier "raw" remis en place. OK
2.
buffreader
remplacer par
reader
. OK

2. 1/ si je ne me trompe pas, récupérer des données c'est bien
getResources().

....2/ ici j'ai mit le
MainActivity.this
mais toujours en rouge
....3/ par contre je n'ai aucune idée de pourquoi le
displayLyrics
est en rouge, est-ce parce qu'il est dans
onItemSelected
?


Et enfin, vous dites << pour le 2e, tu passes un tableau en paramètre alors qu'il attend un int >> c'est à dire ?
A quel niveau ?
0
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
J'aimerais que tu lises les messages d'erreur avant de poster s'il te plait...
Tu as mis
MainActivity.this
, ok, mais tu as fait sauter la virgule entre les 2 paramètres !

Je m'arrête là pour l'instant. Reviens nous voir quand tu auras traiter ces petites erreurs
0
Messages postés
139
Date d'inscription
mercredi 29 août 2018
Statut
Membre
Dernière intervention
6 septembre 2018
140
Oui mais vous ne me dites même pas si les autres changements que j'ai effectuer son bon, alors oui, j'ai remis la virgule après le
MainActivity.this,
mais cette ligne reste rouge, une fois de plus.

Bref, j'en ai marre de cette Application de toute façon, je l'ai faite juste pour m’entraîner et pour mieux comprendre le codage d'une App java. Je m’arrête là. J'en apprendrais surement plus durant ma formation.

Encore merci du temps que vous m'avez consacrer pour résoudre ce problème BrunoCS.

0
Messages postés
15211
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
20 janvier 2022
3 857
Oui mais vous ne me dites même pas si les autres changements que j'ai effectuer son bon, alors
Si l'IDE le souligne en rouge, ce n'est jamais bon... De plus, il faut apprendre également à lire les messages d'erreur retournés par le compilateur ;)
0