我在一个应用程序中展示了一些电话号码,用户可以点击它们拨打电话(autoLink
在textview上设置为phone
)。
当我点击这些数字时,拨打该号码的选项会出现。
我的问题是:有没有办法确定用户是否实际按下了拨号键才进行通话?
我在一个应用程序中展示了一些电话号码,用户可以点击它们拨打电话(autoLink
在textview上设置为phone
)。
当我点击这些数字时,拨打该号码的选项会出现。
我的问题是:有没有办法确定用户是否实际按下了拨号键才进行通话?
<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();
}
}
}
}
}
使用它,你需要这个:
Register the receiver in your manifest
<receiver android:name=".handlers.GSMBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
Then, in the click listener of your phone number button, register a listener: (Note, that you unregister it in the onHangUp() callback!)
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活动的情况。
希望这可以帮助您, 干杯, Gris
如果拨号键盘已打开或未打开,您都可以监听事件。如果拨号键盘未打开,则可以说它来自应用程序...或者以同样的方式处理其他情况。或者,您可以通过从代码拨打号码来调用Web服务API。在响应后,您可以检测它是来自您的应用程序,而不是实际来自拨号键盘,反之亦然。
public class Outgoing_Call_Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
if(intent.getExtras().getString("android.intent.extra.PHONE_NUMBER").equals(new MyApp(context).getEmergencyNumber()));
}
}
}
试试这段代码,它会帮助你的。