我正在开发一个音乐应用程序,该应用程序使用一项服务在后台播放歌曲。在我的服务内部,我有一个代码,用于监听电话状态并在有电话打入时暂停音乐,然后在通话结束后再次播放。
此代码在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);
}
}
此代码在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()
}
}