[英]Android MediaPlayer is not calling registered listener
我已经实现了MediaPlayer实例,以便再现单个文件(mp3格式,实际上我没有尝试使用其他格式)。 我在扩展Handler的自定义类中创建了MediaPlayer的实例。 我在前台服务中使用此类。 除了侦听器的回调外,其他所有操作均正常运行。
我尝试创建一个侦听器实例,并将其传递给setOnCompletionListener()方法,并尝试使用匿名类。 最终,我尝试按照其他帖子中的建议在首次启动播放器后设置监听器。
这是我上次尝试使用的代码:侦听器是在调用播放器start()
方法之前注册的。
public ServiceHandler(Looper looper, Context context) {
super(looper);
this.context=context;
goPlay=true;
}
public void stopWorking(){
goPlay=false;
}
@Override
public void handleMessage(Message msg) {
reproducing=false;
prepared=false;
registered =false;
mp=new MediaPlayer();
if(mp!=null){
Uri path = Uri.parse("android.resource://com.aledev.mygoat/" + R.raw.goat);
try {
mp.setDataSource(context, path);
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
Log.d("onCompletion","onCompletion called.");
AudioManager audio=(AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
audio.setStreamVolume(AudioManager.STREAM_MUSIC,oldVolume,0);
reproducing=false;
Log.d("onCompletion","onCompletion Finished.");
}
});
/* mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
return false;
}
});
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
prepared=true;
}
});*/
mp.setWakeMode(context.getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
//mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setLooping(false);
mp.prepareAsync();
}
catch(java.io.IOException ex){
Log.d("handleMessage","URI not correct.");
}
}
...
while(goPlay){
if (Math.abs(accelVal - oldAccelVal) > ACCEL_DELTA) {
//if((!reproducing)&&(prepared)){
if ((!reproducing)) {
AudioManager audio = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
oldVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
audio.setStreamVolume(AudioManager.STREAM_MUSIC, audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
reproducing = true;
mp.start();
}
}
oldAccelVal = accelVal;
}
manager.unregisterListener(this);
if(mp!=null) {
mp.release();
}
Log.d("handleMessage","Thread: "+this.getLooper().getThread().isInterrupted());
}
我希望布尔标志的重现设置为false,但这不会发生。 但是,将检测到要记录MediaPlayer回放完成的日志,并触发onCompletion事件。
2019-07-24 11:23:55.911 15466-15487/com.aledev.mygoat V/MediaPlayerNative:
playback complete
2019-07-24 11:23:55.911 15466-15487/com.aledev.mygoat V/MediaPlayerNative:
callback application
2019-07-24 11:23:55.911 15466-15487/com.aledev.mygoat V/MediaPlayerNative:
back from callback
我还能尝试什么才能使回调正常工作?
我解决了进入由MediaPlayer的isPlaying()方法限制的while循环的特定问题。
我仍然无法管理监听器回调。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.