我有一个需求,需要检测与Android通话相关的两种事件:
- 每当发生呼出电话时,我的应用程序应该知道这一点,并且要知道拨打的号码
- 当通话因成功/失败而挂断时,我的应用程序应该知道这一点,并且要知道挂断的原因
这在Android中是否可行?
我有一个需求,需要检测与Android通话相关的两种事件:
这在Android中是否可行?
你应该创建一个广播接收器:
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
}
}
}
你应该在清单文件中注册你的应用程序以监听这些意图:
<receiver android:name=".CallReciever" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
有一个更简单的解决方案,只使用TelephonyManager和PhoneStateListener即可。您甚至不必注册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);
}
您需要为以下意图操作创建接收器:
else if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(TelephonyManager.EXTRA_STATE_IDLE)) { }
块中执行了两次。在这个块中,我正在获取呼出电话的详细信息。请建议为什么会发生这种情况? - Ashish Tiwari