您可以创建一个 GSMBroadcastListener 并接收有关电话通话状态的事件(挂断、振铃、已建立等)。
如果你想知道,如果它发生在点击你的电话按钮之后,只需在点击事件中创建这个监听器,这样它只会在你的一个按钮被点击时接收事件。
通话结束后在 Hangup-Event 中解挂(取消注册),因此通话结束后不会收到事件。
这是我在生产应用中使用监听器接口的实现:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
代码:
public interface GSMBroadcastListener {
void onHangUp(
void onEstablished();
void onRinging();
}
public class GSMBroadcastReceiver extends BroadcastReceiver {
private static GSMBroadcastListener handler = null;
private static PrivateListener privateListener = null;
public static void registerGSMBroadcastListener(@Nullable GSMBroadcastListener listener) {
handler = listener;
}
@Override
public void onReceive(Context context, Intent intent) {
if (privateListener == null) {
privateListener = new PrivateListener();
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(privateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
private class PrivateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
Log.i("PHONE_STATE", String.format("GSM event \"onCallStateChanged\" received: state=%d; incomingNumber=\"%s\";", state, incomingNumber));
if (handler != null) {
if (state == TelephonyManager.CALL_STATE_IDLE) {
Log.i("PHONE_STATE", "Forwarding event as \"GSM onHangUp\".");
handler.onHangUp();
} else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
Log.i("PHONE_STATE", "Forwarding event as \"GSM onEstablished\".");
handler.onEstablished();
} else if (state == TelephonyManager.CALL_STATE_RINGING) {
Log.i("PHONE_STATE", "Forwarding event as \"GSM onRinging\".");
handler.onRinging();
}
}
}
}
}
该类会将 GSM 事件转发到您使用 GSMBroadcastReceiver.registerGSMBroadcastListener 添加的侦听器。
要使用它,你需要这个:
-
在您的manifest注册接收器
<receiver android:name=".handlers.GSMBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
-
然后,在你的电话号码按钮的点击监听器中,注册一个监听器:
(注意,您在 onHangUp() 回调中取消注册它!)
GSMBroadcastReceiver.registerGSMBroadcastListener(new GSMBroadcastListener() {
@Override
public void onRinging() {
Log.i("GSM", "GSM event \"onRinging\" received.");
}
@Override
public void onEstablished() {
Log.i("GSM", "GSM event \"onEstablished\" received.");
}
@Override
public void onHangUp() {
Log.i("GSM", "GSM event \"onHangUp\" received.");
GSMBroadcastReceiver.registerGSMBroadcastListener(null); // Unregister the handler!
}
});
就是这样!
现在,您应该会在单击按钮后收到有关 GSM 活动的通知。
希望这会有所帮助,
干杯,
格里斯