wake-up-neo.com

android-Dienste - Fehler: Dienst nicht registriert

Ich versuche, beschränkte Dienste zu verstehen. Unter meinem Beispielprogramm, in dem ich versuche, http://developer.Android.com/guide/components/bound-services.html zu folgen. Der Dienst funktioniert so weit, wie ich das Audio abspielen, anhalten und stoppen kann, wenn ich zu einer anderen App wechsle, bekomme ich den folgenden Dienstfehler nicht registriert. 

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: [email protected]
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)

Da die Kodierung dem Dokumentationsbeispiel genau zu folgen scheint, habe ich keine Ahnung, wo etwas schief geht. Ich führe diese App mit minSdk Level 8 aus. Der Fehler tritt in MainActivity.onStop in der Zeile auf

 mService.unbindService(mConnection);

Alle Vorschläge, um dieses Problem zu lösen, wären großartig.

Vielen Dank

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;
    }
};

}

und

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

}

}
25
dorjeduck

Hatte ein ähnliches Problem, aber die akzeptierte Antwort war nicht die Lösung für mich. Glücklicherweise gab mir einer der Kommentare die Antwort:

onServiceDisconnected soll nicht ausgelöst werden, wenn Sie Ihren Service aufheben, also verlassen Sie sich nicht darauf. Es soll Sie informieren, falls die Verbindung zwischen Ihrem Service und ServiceConnection unterbrochen wird. 

Dank @Waqas fand ich den Fehler: Ich änderte das boolean binded-Flag nur in onServiceConnected() und onServiceDisconnected(). Jetzt habe ich jedes Mal "binded = false" hinzugefügt, wenn ich unbindService() anrufe und das Problem behoben ist. Das ist es, verlasse dich nicht auf onServiceDisconnected

57
Salvatorelab

Ah, einer dieser Tage 

mService.unbindService(mConnection);

es ist offensichtlich Unsinn, Unbindung im falschen Kontext zu nennen. Es sollte sein

unbindService(mConnection); 

Zusätzlicher Fehler in der geposteten Codierung ist das Fehlen von 

@Override
public boolean onUnbind(Intent intent) {
    // All clients have unbound with unbindService()

    releaseMediaPlayer();

    return false;
}
19
dorjeduck

Als Randbemerkung, da keine der anderen Antworten hilfreich war, stellte ich fest, dass mein Fehler eine andere Context für bind und nicht bindung verwendete. Meine Bindung war aus dem Anwendungskontext, aber meine Bindung war aus dem Aktivitätskontext.

Um den Fehler zu beheben, stellte ich sicher, dass derselbe Kontext für bindService() und unbindService() verwendet wurde.

6
Anonsage

Möglicherweise müssen Sie sicherstellen, dass mService nicht null ist. In der folgenden Zeile wurde der Fehler "Dienst nicht registriert" angezeigt:

if (mContext != null) mContext.unbindService(mServiceConn);

Dies war sehr verwirrend, da sowohl mContext als auch mServiceConn nicht null waren.

Das hat es behoben:

if (mContext != null && mService != null) mContext.unbindService(mServiceConn);

2
Jason Hartley

Meine MediaPlayer würde aufhören, wenn ich die App tötete, aber bei einer Schicht von 5 Minuten oder weniger würde sie wieder von alleine starten.

Um dies zu beheben, musste ich zusätzlich zu @dorjeducks Antwort auch mediaPlayer.stop() anrufen, bevor mediaPlayer.release() aufgerufen wurde.

0
craned