2017-03-16 126 views
0

我编程音乐播放器和一个PlayerActivity我有2个活动:的Android音乐播放器 - 一次

  1. 第一个(MainActivity)包含的歌曲的ListView,我设置OnItemClickListener(其onCreate()方法),其打开一个名为PlayerActivity新的活动使已横置的项目位置内:

    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. 第二个(PlayerActivity)具有歌曲的串路径的ArrayList,并用MediaPlayer播放含有该项目的歌曲位置和访问到ArrayList吧:

    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; 
        } 
    } 
    

它完美,但是当我回到前锋的第一个活动(MainActivity),然后我点击到另一个项目(或相同的),它创建另一个PlayerActivity,所以该应用程序同时播放2首歌曲。

我的问题是,我如何实现它,以便它只创建一个PlayerActivity?

回答

0

解决了!我试图通过Intent在MainActivity中创建一个MediaPlayer实例,但似乎无法完成。所以,这里是我的解决方案:

  1. 创建扩展应用程序类和实例的MediaPlayer的出现,让我有一个全球性的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. 设置MyApp的我的应用程序的名称在AndroidManifest.xml中:

    <application 
    android:name="NicoPlayer" 
    ...> 
        ... 
    </application> 
    
  3. 创建PlayerActivity媒体播放实例和全球的MediaPlayer实例分配给它调用getMe diaPlayer(),全部在onCreate()方法中。一旦做到这一点和媒体播放器播放,将其分配到()全球MediaPlayer的实例调用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(); 
    }