2014-08-31 98 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