2014-08-31 96 views
0

我正在處理用戶滑過圖像時播放背景音樂的項目。當用戶到達最後的圖像時,musci停止。當用戶倒退時,它也開始播放。但是,我的歌曲很短,我想實現完成監聽器,以便在第一個音樂結束時,第二個音樂從原始文件夾開始。我的主要問題是我不知道如何在mainactivity.java中實現它。我也讀過android官方指南,但沒有幫助。請提供一些幫助,解釋和說明...如何在媒體播放器中實現完成監聽器android image view

我的代碼如下

Mainactivity.java

import android.app.Activity; 
    import android.content.Intent; 
    import android.media.MediaPlayer; 
    import android.os.Bundle; 
    import android.support.v4.view.ViewPager; 
    import android.support.v4.view.ViewPager.OnPageChangeListener; 
    import android.view.Menu; 

    import android.view.MenuItem; 
    import android.widget.ShareActionProvider; 

    public class MainActivity extends Activity { 

     MediaPlayer oursong; 
     ViewPager viewPager; 
     ImageAdapter adapter; 

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

      oursong = MediaPlayer.create(MainActivity.this, R.raw.a); 
      oursong.seekTo(0); 
      oursong.start(); 

      viewPager = (ViewPager) findViewById(R.id.view_pager); 
      adapter = new ImageAdapter(this); 
      viewPager.setAdapter(adapter); 


      viewPager.setOnPageChangeListener(MyViewPagerListener); 
     } 

     private ShareActionProvider mShareActionProvider; 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
       // Inflate menu resource file. 
       getMenuInflater().inflate(R.menu.activity_main, menu); 

       // Locate MenuItem with ShareActionProvider 
       MenuItem item = menu.findItem(R.id.menu_item_share); 

       // Fetch and store ShareActionProvider 
       mShareActionProvider = (ShareActionProvider) item.getActionProvider(); 
       // Return true to display menu 
       return true; 
     } 

     // Call to update the share intent 
     private void setShareIntent(Intent shareIntent) { 
       if (mShareActionProvider != null) { 
         mShareActionProvider.setShareIntent(shareIntent); 
       } 
     } 

     private int pos = 0; 
     @Override 
     protected void onPause() { 
       super.onPause(); 

       if(oursong != null){ 
        pos = oursong.getCurrentPosition(); 
        oursong.release(); 
        oursong = null; 
       } 
     } 

     @Override 
     protected void onResume(){ 
       super.onResume(); 
      oursong = MediaPlayer.create(MainActivity.this, R.raw.a); 
      oursong.seekTo(pos); // You will probably want to save an int to restore here 
      oursong.start(); 
     } 


     private final OnPageChangeListener MyViewPagerListener = new OnPageChangeListener() { 

       @Override 
       public void onPageSelected(int pos) { 
        if (pos == adapter.getCount() - 1){ 
        // adding null checks for safety 
        if(oursong != null){ 
         oursong.pause(); 
        } 

        } else if (!oursong.isPlaying()){ 

        // adding null check for safety 
        if(oursong != null){ 
         oursong.start(); 
        } 
        }   
       } 

       @Override 
       public void onPageScrolled(int arg0, float arg1, int arg2) { 
       // TODO Auto-generated method stub 

       } 

       @Override 
       public void onPageScrollStateChanged(int arg0) { 
       // TODO Auto-generated method stub 

       } 
      }; 

    } 

回答

0
you have to set on completion listener on mediaplayer instance to determine the song is played 
mP.setOnCompletionListener(new OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
     try { 

      mp.start(); 
      mp.setLooping(true); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}); 
+0

。感謝您的回覆......但我想要播放新歌而不是同一首歌... – biggboss2019 2014-09-10 22:43:50

+0

您可以在此更改數據源 – 2014-09-11 19:40:23

0
  1. 的基本想法是,你需要改變的狀態玩家按正確的順序。 OnCompletion您需要重置,更改音樂,準備異步。 OnPrepared你需要開始玩。

要做到這一點改變這個代碼:

oursong = MediaPlayer.create(MainActivity.this, R.raw.a); 
    oursong.seekTo(0); 
    oursong.start(); 

MyTracksCustomClass tracks = new MyTracksCustomClass(); 

    MediaPlayer oursong = MediaPlayer.create(MainActivity.this, R.raw.a); 
    oursong.setLooping(false); 
    oursong.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mediaPlayer) { 
       mediaPlayer.reset(); 
       try { 
        mediaPlayer.setDataSource(MainActivity.this, tracks.getNextTrack); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       try { 
        mediaPlayer.prepareAsync(); 
       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
       } 
       mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
        @Override 
        public void onPrepared(MediaPlayer mediaPlayer) { 
         mediaPlayer.start(); 
        } 
       }); 
      } 
     } 
    }); 
  • 需要使用另一個類來管理越來越下一曲目「MyTracksCustomClass 「你應該像這樣實施:

    class MyTracksCustomClass { 
        int trackIndex; 
        HashMap<String, Integer> trackResourceIds; 
        MyTracksCustomClass() 
        { 
         trackIndex = 1; 
         // in case you only have two tracks 
         trackResourceIds = new HashMap<String, Integer>(); 
         trackResourceIds.put("1",R.raw.a); 
         trackResourceIds.put("2",R.raw.b); 
        } 
        public int getNextTrack() { 
         // in case you only have two tracks 
         trackIndex = (trackIndex > 3)? 1 : trackIndex; 
         return trackResourceIds.get(trackIndex++ +""); 
    
        } 
    } 
    
  • +0

    這不對。 setDataSource()不會將int作爲參數。你能解決這個例子嗎? – piddler 2018-02-12 01:04:48