Phone State Listner is not working properly android

时间:2016-02-12 22:08:13

标签: android

**It doesn't break while loop while it is in OffHook State . Remain in while loop. Funtion calling in both state is working correctly but **

main.js

2 个答案:

答案 0 :(得分:1)

我从https://github.com/OneCricketeer/schema-registry-transfer-smt获得了完整的工作代码。

呼叫接收方代码。

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;
}

答案 1 :(得分:0)

Each time a broadcast reciever is called, a new instance of it is created. So your code won't work- it will never get the OFFHOOK on the same object. It might work if callStatus is a static, but even then is bad code- you're busy looping on the ui thread.