Wie verhindere ich, dass der Mediaplayer stoppt, wenn der Bildschirm ausgeht?
Ich habe einen Mediaplayer in einemMusic
Klasse, die von einer anderen Sekundarstufe aufgerufen wirdActivity
. Es funktioniert gut.
Wenn der Bildschirm ausgeschaltet wird (entweder durch eine Zeitüberschreitung oder eine Schaltfläche), wird die Musik nicht mehr abgespielt, und wenn Sie zurückkehren und versuchen, die Aktivität zu beenden, wechselt das Programm zu "App reagiert nicht", da einIllegalStateException
bei einer Abfrage wiemediaplayer.isPlaying()
.
Wie kann ich verhindern, dass der Mediaplayer stoppt, wenn der Bildschirm ausgeht?
Muss es durch einen Dienst sein?
Unter der Annahme, dass die Antwort ja lautet, habe ich versucht, die zu konvertierenMusic
Klasse in einen Dienst (siehe unten). Ich habe auch hinzugefügt<service android:enabled="true" android:name=".Music" />
in dieManifest.xml
und ich rufe dieMusic
Klasse wie folgt:
startService(new Intent(getBaseContext(), Music.class));
Music track = Music(fileDescriptor);
Die einzigen zwei neuen Zeilen in der Hauptaktivität sindstartService(new Intent(getBaseContext(), Music.class));
undstopService(new Intent(getBaseContext(), Music.class));
zusammen mit den entsprechenden Einfuhren.
Aber jetzt verstehe ichInstantiationException
Fehler, weilcan't instantiate class
beim Versuch, den Dienst zu starten. Was vermisse ich?
Dies ist die Ausnahme:
E/AndroidRuntime(16642): FATAL EXCEPTION: main
E/AndroidRuntime(16642): java.lang.RuntimeException: Unable to instantiate service com.floritfoto.apps.ave.Music: java.lang.InstantiationException: can't instantiate class com.floritfoto.apps.ave.Music; no empty constructor
E/AndroidRuntime(16642): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2249)
E/AndroidRuntime(16642): at android.app.ActivityThread.access$1600(ActivityThread.java:127)
E/AndroidRuntime(16642): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1213)
E/AndroidRuntime(16642): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(16642): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(16642): at android.app.ActivityThread.main(ActivityThread.java:4507)
E/AndroidRuntime(16642): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(16642): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(16642): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
E/AndroidRuntime(16642): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
E/AndroidRuntime(16642): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(16642): Caused by: java.lang.InstantiationException: can't instantiate class com.floritfoto.apps.ave.Music; no empty constructor
E/AndroidRuntime(16642): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(16642): at java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime(16642): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2246)
E/AndroidRuntime(16642): ... 10 more
und das ist die Music.class:
package com.floritfoto.apps.ave;
import java.io.FileDescriptor;
import java.io.IOException;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.IBinder;
import android.widget.Toast;
public class Music extends Service implements OnCompletionListener{
MediaPlayer mediaPlayer;
boolean isPrepared = false;
//// TEstes de servico
@Override
public void onCreate() {
super.onCreate();
info("Servico criado!");
}
@Override
public void onDestroy() {
info("Servico fudeu!");
}
@Override
public void onStart(Intent intent, int startid) {
info("Servico started!");
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void info(String txt) {
Toast toast = Toast.makeText(getApplicationContext(), txt, Toast.LENGTH_LONG);
toast.show();
}
//// Fim testes de servico
public Music(FileDescriptor fileDescriptor){
mediaPlayer = new MediaPlayer();
try{
mediaPlayer.setDataSource(fileDescriptor);
mediaPlayer.prepare();
isPrepared = true;
mediaPlayer.setOnCompletionListener(this);
} catch(Exception ex){
throw new RuntimeException("Couldn't load music, uh oh!");
}
}
public void onCompletion(MediaPlayer mediaPlayer) {
synchronized(this){
isPrepared = false;
}
}
public void play() {
if(mediaPlayer.isPlaying()) return;
try{
synchronized(this){
if(!isPrepared){
mediaPlayer.prepare();
}
mediaPlayer.seekTo(0);
mediaPlayer.start();
}
} catch(IllegalStateException ex){
ex.printStackTrace();
} catch(IOException ex){
ex.printStackTrace();
}
}
public void stop() {
mediaPlayer.stop();
synchronized(this){
isPrepared = false;
}
}
public void switchTracks(){
mediaPlayer.seekTo(0);
mediaPlayer.pause();
}
public void pause() {
mediaPlayer.pause();
}
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
public boolean isLooping() {
return mediaPlayer.isLooping();
}
public void setLooping(boolean isLooping) {
mediaPlayer.setLooping(isLooping);
}
public void setVolume(float volumeLeft, float volumeRight) {
mediaPlayer.setVolume(volumeLeft, volumeRight);
}
public String getDuration() {
return String.valueOf((int)(mediaPlayer.getDuration()/1000));
}
public void dispose() {
if(mediaPlayer.isPlaying()){
stop();
}
mediaPlayer.release();
}
}