Определить, действительно ли пользователь набрал номер программно
В приложении я показываю некоторые телефонные номера в текстовом представлении, которые пользователь может нажать на них, чтобы набрать их (autoLink
установлен в phone
на просмотр текста).
Когда я нажимаю на цифры, появляется возможность набрать этот номер.
У меня вопрос: есть ли способ выяснить, действительно ли пользователь нажал кнопку набора номера на клавиатуре, чтобы фактически сделать звонок?
3 ответа
Вы можете создать 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 после нажатия кнопки.
Надеюсь, что это помогает, ура, Гри
Вы можете прослушать событие, если панель набора номера открыта или нет, если панель набора номера не открыта, то вы можете сказать, что это из приложения... или как и в других случаях. или вы можете вызвать 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()));
}
}
}
Попробуйте этот код. это поможет вам.