Android: How to use mediaController in service class?

橙三吉。 提交于 2019-11-29 08:20:21

You cannot use mediacontroller class in your service. A service does not contain a GUI so findViewById is not recognized by your service. Instead create an activity which implements mediaController then create your service and bind it to your activity. So you have mediaPlayer in your service and controller in your activity.

This is an overview of activity class.

public class MusicPlayerActivity extends Activity implements MediaController.MediaPlayerControl{
//Do all the stuff
void initMusic(){
    mMediaController = new MediaController(this,false);
    //Note do not create any variable of mediaplayer
    mMediaController.setMediaPlayer(this);       
    mMediaController.setAnchorView(findViewById(R.id.anchorText));

    new Thread(new Runnable() {

        @Override
        public void run() {
        startService(new Intent("PLAY_MUSIC"));
        }
    }).start();
        MusicService.setPathOfSong("Provide the path");

}
}

This is an overview of service class.

public class MusicService extends Service implements MediaPlayer.OnPreparedListener {
private MediaPlayer mMediaPlayer;
private static String pathOfSong;
public int onStartCommand(Intent intent, int flags, int startId) {
        mMediaPlayer=new MediaPlayer();
        mMediaPlayer.setOnPreparedListener(this);
        //Other stuff
}
public static void setPathOfSong(String path)
{
    pathOfSong=path;
}
}
Edo user1419293

I had the same problem and I couldn't get it working the way you have it.

The solution is to bind the Service in the Activity and then you may access the MediaPlayer running in the Service from within your Activity.

Please note that to run this way your Service must have defined all necessary methods like getCurrentPosition etc.

In your Activity add the binding facility:

/****************************************************************** 
 * 
 * Defines callbacks for service binding, passed to bindService() 
 * 
 * ************************************************************** */
private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
};

Then you must modify the onStart() and onStop() methods to Bind/unBind the service.

@Override
protected void onStart() {
    super.onStart();
    // Bind to LocalService
    Intent intent = new Intent(this, MusicService.class);
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();
    // Unbind from the service
    if (mBound) {
        unbindService(mConnection);
        mBound = false;
    }
}

What I did later is to create the following methods

public void showMediaControllerHere(){
    if (mBound){
        mc = new MediaController(mpContext);
        mc.setAnchorView(findViewById(R.id.anchorText));
        mc.setMediaPlayer(mService);
        mc.setEnabled(true);
        mc.show(0);
    }
}
@Override
  public boolean onTouchEvent(MotionEvent event) {
    //the MediaController will hide after 3 seconds - tap the screen to make it appear again
    if (first){
          if (mBound){
              showMediaControllerHere();
              first = false;
          }
      }
      else {
          if (mBound){
              mc.show(0);
          }
      }
    return false;
  }

first is a boolean that is used to realize whether we have to create the mediacontroller or not, I create only on the first time the user touches the screen.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!