繁体   English   中英

Android MediaPlayer未调用注册的侦听器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM