在服务内部的线程中调用PhoneStateListener

问题描述 投票:0回答:1

我正在开发一个音乐应用程序,该应用程序使用一项服务在后台播放歌曲。在我的服务内部,我有一个代码,用于监听电话状态并在有电话打入时暂停音乐,然后在通话结束后再次播放。

此代码在onCreate内正常工作,但是当我将其放入Thread时,它会给出:java.lang.NullPointerException:尝试从空对象引用中的字段'android.os.MessageQueue android.os.Looper.mQueue'中读取

我尝试了什么:我试图将Looper.prepare放入代码中。这样可以防止崩溃,但是当有电话打入时,歌曲不会停止播放。我想我没有正确使用Looper功能。

final class phoneStateThread implements Runnable
    {

        @Override
        public void run() {


                Log.v(TAG,"Starting telephony");
                telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                Log.v(TAG,"Starting listener");
                phoneStateListener = new PhoneStateListener(){
                    @Override
                    public void onCallStateChanged(int state, String incomingNumber) {
                        Log.v(TAG,"Starting CallStateChange");
                        switch (state){

                            //=====Phone ringing. Pause music=====
                            case TelephonyManager.CALL_STATE_OFFHOOK:
                            case TelephonyManager.CALL_STATE_RINGING:
                                if(mediaPlayer!=null) {
                                    pauseMedia();
                                    isPausedInCall=true;
                                }

                                break;

                            //=====Phone idle. start music=====
                            case TelephonyManager.CALL_STATE_IDLE:
                                if(mediaPlayer!=null){
                                    if(isPausedInCall){
                                        isPausedInCall=false;
                                        playMedia();
                                    }
                                }
                                break;
                        }

                    }

                };


                telephonyManager.listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);
            }
        }
android multithreading android-service runnable android-thread
1个回答
0
投票

此代码在onCreate内正常工作>

因为使用Android Main Thread的Looper,将代码放入Thread时,那里的Looper不可用,所以需要制作自己的Looper。试试这个

final class phoneStateThread implements Runnable
    {

        @Override
        public void run() {

                Looper.prepare()
                Log.v(TAG,"Starting telephony");
                telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                Log.v(TAG,"Starting listener");
                phoneStateListener = new PhoneStateListener(){
                    @Override
                    public void onCallStateChanged(int state, String incomingNumber) {
                        Log.v(TAG,"Starting CallStateChange");
                        switch (state){

                            //=====Phone ringing. Pause music=====
                            case TelephonyManager.CALL_STATE_OFFHOOK:
                            case TelephonyManager.CALL_STATE_RINGING:
                                if(mediaPlayer!=null) {
                                    pauseMedia();
                                    isPausedInCall=true;
                                }

                                break;

                            //=====Phone idle. start music=====
                            case TelephonyManager.CALL_STATE_IDLE:
                                if(mediaPlayer!=null){
                                    if(isPausedInCall){
                                        isPausedInCall=false;
                                        playMedia();
                                    }
                                }
                                break;
                        }

                    }

                };


                telephonyManager.listen(phoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);
                Looper.loop()
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.