Android 手机状态列表器无法正常工作

Android 手机状态列表器无法正常工作,android,Android,**当循环处于脱机状态时,它不会中断。保持在while循环中。两种状态下的函数调用都正常工作,但** PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { // TODO Auto-ge

**当循环处于脱机状态时,它不会中断。保持在while循环中。两种状态下的函数调用都正常工作,但**

PhoneStateListener phoneStateListener = new PhoneStateListener() {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                // TODO Auto-generated method stub
                // super.onCallStateChanged(state, incomingNumber);
                switch (state) {
                case  TelephonyManager.CALL_STATE_RINGING:
                    callStatus=true;
                    while(callStatus)
                    {

                    OnOff();
                    if(state==TelephonyManager.CALL_STATE_OFFHOOK)
                    {
                        break;

                    }

                    }
                    break;
                case  TelephonyManager.CALL_STATE_OFFHOOK:
                    callStatus=false;
                    Off();
                    break;
                default:
                    break;
                }

每次调用广播接收器时,都会创建一个新的实例。因此,您的代码将无法工作-它将永远无法在同一对象上脱离钩子。如果callStatus是静态的,它可能会工作,但即使是静态的,它也是错误的代码-您正忙于在ui线程上循环。

我从中获得了完整的工作代码

呼叫接收器代码

public class CallReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    //Log.w("intent " , intent.getAction().toString());
    TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    MyPhoneStateListener customPhoneListener = new MyPhoneStateListener();

    telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);

    Bundle bundle = intent.getExtras();
    String phone_number = bundle.getString("incoming_number");

    String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
    // String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
    int state = 0;
    if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){
        state = TelephonyManager.CALL_STATE_IDLE;
    }
    else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
        state = TelephonyManager.CALL_STATE_OFFHOOK;
    }
    else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){
        state = TelephonyManager.CALL_STATE_RINGING;
    }
    if (phone_number == null || "".equals(phone_number)) {
        return;
    }
    customPhoneListener.onCallStateChanged(context, state, phone_number);
    Toast.makeText(context, "Phone Number " + phone_number , Toast.LENGTH_SHORT).show();
}}
呼叫侦听器

public void onCallStateChanged(Context context, int state, String phoneNumber){
    if(lastState == state){
        //No change, debounce extras
        return;
    }

    System.out.println("Number inside onCallStateChange : "  + phoneNumber);
    switch(state){
        case TelephonyManager.CALL_STATE_RINGING:
            isIncoming = true;
            callStartTime = new Date();

            Toast.makeText(context, "Incoming Call Ringing " + phoneNumber, Toast.LENGTH_SHORT).show();
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
            if(lastState != TelephonyManager.CALL_STATE_RINGING){
                isIncoming = false;
                callStartTime = new Date();
                Toast.makeText(context, "Outgoing Call Started " + phoneNumber, Toast.LENGTH_SHORT).show();
            }
            break;

        case TelephonyManager.CALL_STATE_IDLE:
            //Went to idle-  this is the end of a call.  What type depends on previous state(s)
            if(lastState == TelephonyManager.CALL_STATE_RINGING){
                //Ring but no pickup-  a miss
                Toast.makeText(context, "Ringing but no pickup" + phoneNumber + " Call time " + callStartTime +" Date " + new Date() , Toast.LENGTH_SHORT).show();
            }
            else if(isIncoming){

                Toast.makeText(context, "Incoming " + phoneNumber + " Call time " + callStartTime  , Toast.LENGTH_SHORT).show();
            }
            else{

                Toast.makeText(context, "outgoing " + phoneNumber + " Call time " + callStartTime +" Date " + new Date() , Toast.LENGTH_SHORT).show();

            }

            break;
    }
    lastState = state;
}

欢迎来到SO。不幸的是,你很难弄清楚你在问什么。您编写的唯一非代码更像是意识流,而不是问题描述。你还没有给我们足够的代码来找出问题的原因。如果你能把它变成一个(在这种情况下,重点是“完整的”),那将是最好的。