2017-03-16 3 views
0

Je suis la programmation d'un lecteur de musique et j'ai 2 activités:lecteur de musique Android - Un PlayerActivity à un moment

  1. Le premier (MainActivity) contient une ListView de chansons, et je mets un OnItemClickListener (à l'intérieur de son onCreate() méthode) qui ouvre une nouvelle activité appelée PlayerActivity passant par la position de l'élément qui a été choisi:

    public class MainActivity extends AppCompatActivity { 
        Intent intent; 
        ArrayList<String> artistsTitles; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
         intent=new Intent(getApplicationContext(), PlayerActivity.class); 
         artistsTitles=getArtistTitle(); 
         ListView mainList=(ListView) findViewById(R.id.mainList); 
         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, artistsTitles); 
         mainList.setAdapter(adapter); 
         mainList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
          @Override 
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
           intent.putExtra("currentSong", position); 
           startActivity(intent); 
          } 
         }); 
        } 
    
        private ArrayList<String> getArtistTitle() { 
         ContentResolver musicResolve = getContentResolver(); 
         String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 
         String[] projection = { MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE}; 
         Uri uri=android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
         Cursor cursor = musicResolve.query(uri, projection, selection, null, null); 
    
         ArrayList<String> arrayList=new ArrayList<String>(); 
         while(cursor.moveToNext()) 
          arrayList.add(cursor.getString(0)+" - "+cursor.getString(1)); 
    
         return arrayList; 
        } 
    } 
    
  2. le second (PlayerActivity) présente une liste de tableaux des chemins de chaîne des chansons, et avec un MediaPlayer, joue la chanson ayant l'objet la position et l'accès à l'ArrayList avec elle:

    public class PlayerActivity extends AppCompatActivity { 
        ArrayList<String> songs; 
        MediaPlayer mediaPlayer; 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_player); 
         songs=new ArrayList<String>(); 
         songs=getSongs(); 
         String songPath=songs.get(intent.getIntExtra("songID", 0)); 
         mediaPlayer=MediaPlayer.create(getApplicationContext(), Uri.parse(songPath)); 
         try { 
          mediaPlayer.reset(); 
          mediaPlayer.setDataSource(getApplicationContext(), Uri.parse(songPath)); 
          mediaPlayer.prepare(); 
          mediaPlayer.start(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
    
        private ArrayList<String> getSongs() { 
         ContentResolver musicResolve = getContentResolver(); 
    
         String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 
         String[] projection = {MediaStore.Audio.Media.DATA}; 
         Uri uri=android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
         Cursor cursor = musicResolve.query(uri, projection, selection, null, null); 
    
         ArrayList<String> s = new ArrayList<String>(); 
         while(cursor.moveToNext()) 
          s.add(cursor.getString(0)); 
    
         return s; 
        } 
    } 
    

Il fonctionne parfaitement, mais quand je revenir avant la première activité (MainActivity), puis je tape à un autre élément (ou la même), il crée un autre PlayerActivity, donc l'application joue 2 chansons en même temps.

Ma question est, comment puis-je l'implémenter afin qu'il ne crée qu'une seule PlayerActivity?

Répondre

0

Vérifiez le mode de lancement de l'activité dans votre manifeste. https://developer.android.com/guide/topics/manifest/activity-element.html#lmode

+0

J'ai vérifié pour singleTask et SingleInstance, mais il fait le même ... – georgenda182

+0

que nous besoin de plus de code de votre activité. Où est votre mediaplayer initialisé, où est placé le chargement de votre chanson, ... – Fusselchen

+0

Le code a été téléchargé! Merci de votre attention. – georgenda182

0

Résolu! J'ai essayé de passer via Intent une instance de MediaPlayer créée dans MainActivity, mais il semble que ce ne soit pas possible. Alors, voici ma solution:

  1. Créer une classe qui étend l'application et instancier MediaPlayer là, de sorte que j'ai un objet global MediaPlayer:

    import android.app.Application; 
    import android.media.MediaPlayer; 
    
    public class MyApp extends Application { 
        MediaPlayer mediaPlayer=null; 
    
        public MediaPlayer getMediaPlayer() { 
         return mediaPlayer; 
        } 
    
        public void setMediaPlayer(MediaPlayer mediaPlayer) { 
         this.mediaPlayer=mediaPlayer; 
        } 
    } 
    
  2. Set MyApp comme nom de ma demande le AndroidManifest.xml:

    <application 
    android:name="NicoPlayer" 
    ...> 
        ... 
    </application> 
    
  3. Créer une instance MediaPlayer dans PlayerActivity et assigner l'instance globale de MediaPlayer à elle appeler GetMe diaPlayer(), tous dans la méthode onCreate(). Une fois que cela est fait et MediaPlayer joue, l'assigner à l'instance mondiale de MediaPlayer appelant setMediaPlayer():

    mediaPlayer=((NicoPlayer)this.getApplication()).getMediaPlayer(); 
    if(mediaPlayer==null) 
        mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.parse(songPath)); 
    ((NicoPlayer)this.getApplication()).setMediaPlayer(mediaPlayer); 
    try { 
        mediaPlayer.reset(); 
        mediaPlayer.setDataSource(getApplicationContext(), Uri.parse(songPath)); 
        mediaPlayer.prepare(); 
        mediaPlayer.start(); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    }