为什么电话状态监听器会因同一个呼叫被同一个状态多次触发?

时间:2015-09-09 06:09:09

标签: android broadcastreceiver incoming-call

我正在努力获取最近的通话记录,因为呼叫断开(传出,传入)已应答或未应答。

我正在使用电话状态监听器在呼叫断开时触发广播,但是为了一次呼叫多次被解雇为什么会这样.. ??

所以请告诉我如何只接听一次电话接收器。

这是我的代码

public class BroadcastReceiver  extends android.content.BroadcastReceiver{
    static boolean iscallended= true;
    Context mContext;
    TelephonyManager telephony;
     private static final String TAG = "CustomBroadcastReceiver";
    CustomPhoneStateListener customPhoneStateListener;

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        mContext = context;
        Bundle extras = intent.getExtras();
        if (extras != null) {
            String state = extras.getString(TelephonyManager.EXTRA_STATE);
            Log.w("DEBUG", state);

                telephony = (TelephonyManager)context.getSystemService(context.TELEPHONY_SERVICE);
               if(customPhoneStateListener==null)
               {

                customPhoneStateListener = new   CustomPhoneStateListener();
                telephony.listen(customPhoneStateListener,   PhoneStateListener.LISTEN_CALL_STATE);
               }



        }



    }
    private class CustomPhoneStateListener extends PhoneStateListener
    {
         private static final String TAG = "CustomPhoneStateListener";
         Handler handler=new Handler();

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            // TODO Auto-generated method stub
            System.out.println(iscallended+  "  value of iscancelled ");
             switch (state) 
             {
             case TelephonyManager.CALL_STATE_RINGING:
                 if(!incomingNumber.equalsIgnoreCase(""))
                 {
                     //YOUR CODE HERE

                 }
                 break;

             case TelephonyManager.CALL_STATE_IDLE:
                 if(iscallended)
                 {
                     iscallended = false;
                 System.out.println("IDLE called");
                 Toast.makeText(mContext, "IDLE", Toast.LENGTH_SHORT).show();
                 Intent it = new Intent(mContext,MainActivity.class);
                 it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                 mContext.startActivity(it);
                 }
                 break;
             default:
                 break;
             }
             super.onCallStateChanged(state, incomingNumber);
             telephony.listen(customPhoneStateListener, PhoneStateListener.LISTEN_NONE);
        }







    }

}

这是清单中的接收者

 <receiver android:name="com.example.calllogs.BroadcastReceiver">
            <intent-filter >

                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter>


        </receiver>

2 个答案:

答案 0 :(得分:0)

是的,你会得到的。

typedef

以上是示例,当您查看设备日志时,您肯定会多次看到摘机以及IDLE状态。

尝试计算一下,它应该没问题。

答案 1 :(得分:0)

为避免重复触发,请使用MyPhoneStateListener作为对象并选中lastCallState。从makeMyPhoneStateListener致电ServiceReceiver

class MyPhoneStateListener () : PhoneStateListener() {

    companion object {

        var lastCallState: Int? = null
        lateinit var context: Context

        fun makeMyPhoneStateListener(_context: Context): MyPhoneStateListener
        {
            val myPhoneStateListener = MyPhoneStateListener()
            context = _context
            return myPhoneStateListener
        }
    }

    override fun onCallStateChanged(state: Int, incomingNumber: String) {

        when (state) {
            TelephonyManager.CALL_STATE_IDLE -> {

                if (lastCallState!= TelephonyManager.CALL_STATE_IDLE){
                    // some code for CALL_STATE_IDLE
                    lastCallState = TelephonyManager.CALL_STATE_IDLE
                }
            }
            TelephonyManager.CALL_STATE_OFFHOOK -> {

                if (lastCallState!= TelephonyManager.CALL_STATE_OFFHOOK) {

                    // some code for CALL_STATE_OFFHOOK
                    lastCallState = TelephonyManager.CALL_STATE_OFFHOOK
                }
            }
            TelephonyManager.CALL_STATE_RINGING -> {
                if (lastCallState!= TelephonyManager.CALL_STATE_RINGING) {

                    // some code for CALL_STATE_RINGING
                    lastCallState = TelephonyManager.CALL_STATE_RINGING    
                }
            }    
        }    
    }