2011-03-31 50 views
25

我有一个要求,其中我想检测两种Android中检测呼出和通话挂机事件的Android

  1. 每当呼出由与呼叫无关的事件,我的应用程序应该知道这与被叫号码
  2. 当电话挂了(由于成功/失败)一起,我的应用程序应该知道这与挂断

的原因沿着这是可能的Android中?

回答

24

你应该创建一个BroadcastReceiver:

public class CallReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_RINGING)) { 

       // Phone number 
       String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); 

       // Ringing state 
       // This code will execute when the phone has an incoming call 
     } else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_IDLE) 
       || intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
         TelephonyManager.EXTRA_STATE_OFFHOOK)) { 

      // This code will execute when the call is answered or disconnected 
     } 

    } 
} 

你应该注册你一个pplication听清单中的这些意图:

<receiver android:name=".CallReciever" > 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
</receiver> 
+0

感谢您的举报代码 有没有一种方法来捕获传出呼叫,以及类似于捕获来电的方式? – user669231 2011-03-31 10:41:13

+0

@ user669231是的,您应该更改if-state中的支票。你可以看到这个主题:http://stackoverflow.com/questions/2668445/detect-outgoing-calls-and-problem-with-a-real-device – vendor 2011-03-31 10:59:01

+1

工程就像一个魅力。此外,您必须在manifest.xml文件中声明以下权限: <使用权限android:name =“android.permission.READ_PHONE_STATE”/> 否则,这将不起作用。 见TelephonyManager类的API: http://developer.android.com/reference/android/telephony/TelephonyManager.html – qupera 2014-10-08 09:19:15

4

你需要创建一个接收器用于以下目的的行动:

  1. 拨出号码 - ACTION_NEW_OUTGOING_CALL
  2. 电话挂断 - ACTION_PHONE_STATE_CHANGED
+0

你能不能给我一个例子,我对呼出 – 2012-12-24 11:47:01

+0

需要上述解决方案完美地工作了me.But接收器接收相同的状态多次。我们如何解决这个问题?无论如何检测接收意图的ID或其他方式? – 2015-10-09 11:47:48

8

有只使用TelephonyManager和 PhoneStateListener.You鸵鸟政策甚至要注册一个BroadcastReceiver一个简单的解决方案。

public class MyPhoneStateListener extends PhoneStateListener { 

    @Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     switch (state) { 
      //Hangup 
      case TelephonyManager.CALL_STATE_IDLE: 
       break; 
      //Outgoing 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       break; 
      //Incoming 
      case TelephonyManager.CALL_STATE_RINGING: 
       break; 
     } 
    } 
} 

并注册它:

public static void registerListener(Context context) { 
    ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).listen(new MyPhoneStateListener(), 
      PhoneStateListener.LISTEN_CALL_STATE); 
} 
+0

这不适用于拨出电话。 – ralphgabb 2015-07-30 01:35:41