Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android services - error: service not registered

I am trying to understand bounded services. Below my sample program in which I try to follow http://developer.android.com/guide/components/bound-services.html . The service functions as far as I can play, pause, and stop the audio yet when I switch to another app I get the following Service not registered error.

java.lang.RuntimeException: Unable to stop activity {com.example.dd_services_audio_01/com.example.dd_services_audio_01.MainActivity}: java.lang.IllegalArgumentException: Service not registered: com.example.dd_services_audio_01.MainActivity$1@2afca5d8 09-05 14:04:32.625: E/AndroidRuntime(5810):     at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:2451) 09-05 14:04:32.625: E/AndroidRuntime(5810):     at android.app.ActivityThread.handleStopActivity(ActivityThread.java:2496) 

As the coding seems to follow the documentation example closely I have no clue where things go wrong. I run this app with minSdk level 8. The error happens in MainActivity.onStop at the line

 mService.unbindService(mConnection); 

Any suggestions to solve this would be great.

Thanks

martin

package com.example.dd_services_audio_01;  import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Environment; import android.os.IBinder; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;  import com.example.dd_services_audio_01.AudioPlayerService.AudioPlayerBinder;  public class MainActivity extends Activity {  private final String TAG = "MainActivity";  AudioPlayerService mService; boolean mBound = false;  Button mPlay, mPause, mStop;  String audioFile = Environment.getExternalStorageDirectory()         + "/justdzongsar/DJKR_AboutToGetIt.mp3";  @Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);      Log.d(TAG,"onCreate");     setContentView(R.layout.activity_main);      mPlay = (Button) findViewById(R.id.buttonPlay);     mPause = (Button) findViewById(R.id.buttonPause);     mStop = (Button) findViewById(R.id.buttonStop);      mPlay.setOnClickListener(new OnClickListener() {         public void onClick(View v) {             mService.play(audioFile);         }     });      mPause.setOnClickListener(new OnClickListener() {         public void onClick(View v) {             mService.pause();         }     });      mStop.setOnClickListener(new OnClickListener() {         public void onClick(View v) {             mService.stop();         }     });  }  @Override public boolean onCreateOptionsMenu(Menu menu) {     getMenuInflater().inflate(R.menu.activity_main, menu);     return true; }  @Override protected void onStart() {     super.onStart();     // Bind to LocalService     Intent intent = new Intent(this, AudioPlayerService.class);     bindService(intent, mConnection, Context.BIND_AUTO_CREATE);   }  @Override protected void onStop() {     super.onStop();      if (mBound) {         mService.unbindService(mConnection);         mBound=false;     } }   /** 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         AudioPlayerBinder binder = (AudioPlayerBinder) service;         mService = binder.getService();         mBound = true;     }      @Override     public void onServiceDisconnected(ComponentName arg0) {         mService = null;         mBound = false;     } };  } 

and

package com.example.dd_services_audio_01;  import java.io.IOException;  import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.os.Binder; import android.os.IBinder; import android.util.Log;  public class AudioPlayerService extends Service implements OnPreparedListener,     OnCompletionListener {  private final String TAG = "AudioPlayerService";  private final IBinder mBinder = new AudioPlayerBinder();  private MediaPlayer mMediaPlayer;  private String currentDataSource;  public class AudioPlayerBinder extends Binder {     public AudioPlayerService getService() {         Log.v(TAG, "AudioPlayerBinder: getService() called");         return AudioPlayerService.this;     } }  @Override public IBinder onBind(Intent intent) {     // TODO Auto-generated method stub     return mBinder; }  @Override public boolean onUnbind(Intent intent) {     // All clients have unbound with unbindService()     return false; }  @Override public void onStart(Intent intent, int startId) {     Log.i(TAG,             "AudioPlayerService: onStart() called, instance="                     + this.hashCode()); }  @Override public void onDestroy() {     Log.i(TAG, "AudioPlayerService: onDestroy() called");     releaseMediaPlayer(); }  // -----  public void play(String audioFile) {     Log.d(TAG, "audio play called with file " + audioFile);     if (mMediaPlayer != null && audioFile.compareTo(currentDataSource) == 0) {         if (mMediaPlayer.isPlaying() == true) {             return;         }         mMediaPlayer.start();          return;     }     releaseMediaPlayer();      try {          mMediaPlayer = new MediaPlayer();         mMediaPlayer.setDataSource(audioFile);           mMediaPlayer.setOnPreparedListener(this);         mMediaPlayer.setOnCompletionListener(this);         currentDataSource = audioFile;                      mMediaPlayer.prepareAsync();       } catch (IOException ioe) {         Log.e(TAG, "error trying to play " + audioFile, ioe);     }  }  public void pause() {      Log.d(TAG, "audio pause");     if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {         mMediaPlayer.pause();     } }  public void seek(int timeInMillis) {     if (mMediaPlayer != null) {         mMediaPlayer.seekTo(timeInMillis);     } }  public int elapsed() {     if (mMediaPlayer == null) {         return 0;     }     return mMediaPlayer.getCurrentPosition(); }  public void stop() {     Log.d(TAG, "audio stop");     releaseMediaPlayer(); }  // --  private void releaseMediaPlayer() {     if (mMediaPlayer == null) {         return;     }      if (mMediaPlayer.isPlaying()) {         mMediaPlayer.stop();     }     mMediaPlayer.release();     mMediaPlayer = null; }  @Override public void onCompletion(MediaPlayer arg0) {     // TODO Auto-generated method stub     releaseMediaPlayer(); }  @Override public void onPrepared(MediaPlayer mp) {     if (mp != null) {         mp.start();     }      // TODO Auto-generated method stub  }  } 
like image 691
dorjeduck Avatar asked Sep 05 '12 08:09

dorjeduck


2 Answers

Had a similar problem, but the accepted answer was not the solution for me. Luckily one of the comments gave me the answer:

onServiceDisconnected is not supposed to be raised when you unbind your service, so don't rely on it. It is supposed to inform you in case the connection between your Service and ServiceConnection is dropped.

Thanks to @Waqas I found the error: I was updating the boolean binded flag only inside onServiceConnected() and onServiceDisconnected(). Now I've added "binded=false" every time I call unbindService() and the problem has gone. That's it, don't rely on onServiceDisconnected

like image 177
Salvatorelab Avatar answered Sep 21 '22 02:09

Salvatorelab


Ah, one of these days

mService.unbindService(mConnection); 

is obviously nonsense, calling unbind in the wrong context. It should be

unbindService(mConnection);  

Additional mistake in the posted coding is the missing of

@Override public boolean onUnbind(Intent intent) {     // All clients have unbound with unbindService()      releaseMediaPlayer();      return false; } 
like image 29
dorjeduck Avatar answered Sep 25 '22 02:09

dorjeduck