如何在android中识别来电和拨出电话

时间:2011-09-20 12:54:26

标签: android broadcastreceiver

如何分别在android中获取来电和拨出电话的事件。 实际上我正在尝试开发一个在来电时打开的应用程序,如果数字存在于数据库中并且工作正常。但如果我从设备拨打电话(拨打电话),如果数字存在于数据库中,它仍会打开我的应用程序。 我想限制在拨打电话时打开我的应用程序。

我的清单包含我收到这样的来电:

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

IncomingCallReceiver:

MyPhoneStateListener phoneListener=new MyPhoneStateListener(context);
TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);

MyPhoneStateListener:

public void onCallStateChanged(int state,String incomingNumber){
      switch(state) {
          case TelephonyManager.CALL_STATE_IDLE:
              Log.d("DEBUG", "IDLE");
          break;
          case TelephonyManager.CALL_STATE_OFFHOOK:
              Log.d("DEBUG", "OFFHOOK");                        
              Intent i = new Intent(context, MyMainActivity.class);
              i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
              context.startActivity(i);
          break;
          case TelephonyManager.CALL_STATE_RINGING:
              Log.d("DEBUG", "RINGING");
          break;
    }
}

任何人都可以帮助我区分拨出电话与来电,以便我处理此事件。

提前致谢。

3 个答案:

答案 0 :(得分:5)

  

我想限制在拨打电话时打开我的应用程序。

case TelephonyManager.CALL_STATE_OFFHOOK:检查以前的状态是CALL_STATE_RINGING还是CALL_STATE_IDLE(例如,在两种情况下都设置了不同的标志)。
在后一种情况下,继续打开您的应用程序,否则什么都不做

答案 1 :(得分:4)

在您的接收器中添加<action android:name="android.intent.action.NEW_OUTGOING_CALL" />并使用您的onReceive()方法进行处理。

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

答案 2 :(得分:-1)

意图操作android.intent.action.NEW_OUTGOING_CALL处理拨出电话,但对于来电,我建议以这种方式检查:

if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
        //outgoing call
} else if (intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) != null) {
        //incoming call
}