SVP ! Spinner onItemSelected ==> 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 1 sept. 2018 à 15:58
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 - 6 sept. 2018 à 16:19
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

A voir également:

6 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
3 sept. 2018 à 11:46
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
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
3 sept. 2018 à 13:24
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
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
3 sept. 2018 à 13:29
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
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
3 sept. 2018 à 13:31
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
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
Modifié le 3 sept. 2018 à 13:46
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
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
3 sept. 2018 à 14:07
Donc c'est une musique par pays ?
0
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
3 sept. 2018 à 14:13
Exactement !

Une musique, Un Lyrics ===> Un pays
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
3 sept. 2018 à 14:34
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
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
3 sept. 2018 à 15:07
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
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
3 sept. 2018 à 16:17
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
Modifié le 4 sept. 2018 à 16:42
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
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
4 sept. 2018 à 17:04
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
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
4 sept. 2018 à 18:09
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
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
5 sept. 2018 à 11:03
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
Umwami Messages postés 140 Date d'inscription mercredi 29 août 2018 Statut Membre Dernière intervention 6 septembre 2018 133
5 sept. 2018 à 13:37
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
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 3 894
6 sept. 2018 à 16:19
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