sigue - Servicios de Android-error: servicio no registrado
servicios de google play continua fallando (5)
Ah, uno de estos dias
mService.unbindService(mConnection);
Es obvio que no tiene sentido, llamar a desvincular en el contexto equivocado. Debería ser
unbindService(mConnection);
Error adicional en la codificación publicada es la falta de
@Override
public boolean onUnbind(Intent intent) {
// All clients have unbound with unbindService()
releaseMediaPlayer();
return false;
}
Estoy tratando de entender los servicios limitados. Debajo de mi programa de muestra en el que trato de seguir http://developer.android.com/guide/components/bound-services.html . El servicio funciona en la medida en que puedo reproducir, pausar y detener el audio. Sin embargo, cuando cambio a otra aplicación, aparece el siguiente error de Servicio no registrado.
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)
Como la codificación parece seguir de cerca el ejemplo de la documentación, no tengo idea de dónde van las cosas mal. Ejecuto esta aplicación con minSdk nivel 8. El error ocurre en MainActivity.onStop en la línea
mService.unbindService(mConnection);
Cualquier sugerencia para resolver esto sería genial.
Gracias
martín
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;
}
};
}
y
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
}
}
Como una nota al margen, ya que ninguna de las otras respuestas ayudó, descubrí que mi error estaba usando un Context
diferente para vincular y desvincular. Mi enlace era del contexto de la Aplicación, pero mi desvinculación era del contexto de la Actividad.
Para corregir el error, me aseguré de usar el mismo contexto para bindService()
y unbindService()
.
Es posible que deba asegurarse de que mService no sea nulo. La siguiente línea me dio el error "Servicio no registrado":
if (mContext != null) mContext.unbindService(mServiceConn);
Esto fue muy confuso porque mContext y mServiceConn no eran nulos.
Esto lo arregló:
if (mContext != null && mService != null) mContext.unbindService(mServiceConn);
Mi MediaPlayer
se detendría cuando eliminara la aplicación, pero a los 5 minutos de la capa o menos, se volvería a iniciar por sí solo.
Para solucionar esto, además de la respuesta de @ dorjeduck, también tuve que llamar a mediaPlayer.stop()
antes de llamar a mediaPlayer.release()
.
Tenía un problema similar, pero la respuesta aceptada no era la solución para mí. Por suerte uno de los comentarios me dio la respuesta:
Se supone que onServiceDisconnected no se genera cuando desvincula su servicio, por lo que no confíe en él. Se supone que debe informarle en caso de que se interrumpa la conexión entre su Servicio y la Conexión de servicio.
Gracias a @Waqas encontré el error: estaba actualizando la onServiceConnected()
boolean binded
solo dentro de onServiceConnected()
y onServiceDisconnected()
. Ahora agregué "binded = false" cada vez que llamé a unbindService()
y el problema desapareció. Eso es todo, no confíe en onServiceDisconnected