Intereting Posts
Изменение цвета фона кнопки SearchView и запроса Как минимизировать карты на износе андроида? Какова реальная разница между ACTION_GET_CONTENT и ACTION_OPEN_DOCUMENT? Исключение: попытка получить ссылку на закрытие SQLiteClosable Android-браузер делает границы неправильными, если радиус границы меньше общей ширины границы Создание макета без рамки, которая перекрывает фоновый слой Как реализовать mbtowc для Android? (Или, в идеале, как не?) Автоматическая съемка без участия пользователя Поток приложений для подключения к одноранговой сети для Android? Где я могу получить список всех команд Robotium? Android: проверьте, является ли фрагмент видимым Как открыть сообщение Url после Firebase в фоновом режиме Заполнение Android Spinner со списком объектов Android: Как остановить музыкальное обслуживание моего приложения, если другое приложение играет музыку.? Как заставить клавиатуру отображать / скрывать?

Как закрыть / отменить / отклонить системный диалог программным способом (Android)

У меня есть приложение, которое делает вызовы USSD, но после всех вызовов USSD я получил диалог с результатом для пользователя.

Я знаю, что можно отменить это диалоговое окно, потому что приложение «USSD Checker» делает это, они получают ответ от USSD, не показывая диалоговое окно пользователя.

В классе телефона Utils

displayMMIComplete функция, которая после завершения вызова Ussd показывает TYPE_SYSTEM_DIALOG . В PhoneUtils.java они используют диалоговое окно следующим образом:

 AlertDialog newDialog = new AlertDialog.Builder(context) .setMessage(text) .setPositiveButton(R.string.ok, null) .setCancelable(true) .create(); newDialog.getWindow().setType( WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); newDialog.getWindow().addFlags( WindowManager.LayoutParams.FLAG_DIM_BEHIND); newDialog.show(); 

Тогда я не могу просто отправить флаг, чтобы его отклонить. И я не могу использовать этот импорт своего системного класса.

И когда я делаю X последовательных звонков, появляется диалоговое окно X с пользователем, и моему приложению нужно будет делать последовательные вызовы, так или иначе, чтобы программно закрыть этот системный диалог?

Я нашел ответ на свой вопрос, если вы пытаетесь использовать USSD-вызовы, вы можете отключить текст результата

В российском блоге есть сообщение, в котором показано, как вы можете подключиться к службе phoneutils для Android, а затем управлять текстами из USSD (CALL и RESULT). Он показывает образец с использованием интерфейса (IExtentedendNetworkService), который связывается с телефонными утилитами только при запуске ОС Android и если не было другого приложения, пытающегося сделать то же самое (поскольку только одна служба может быть связана и, возможно, будет вашей или нет, Я не знаю правила, которое использует ОС Android).

В функции «CharSequence getUserMessage (текст CharSequence)»; Если вы вернете нуль, диалоговое окно результатов не появится.

Просто добавьте эту строку в свой код.

 Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(intent); 

Я нашел простой ответ из этого блога. Сначала мы должны создать простую службу Accessibility. Служба Accessibility Service работает только в том случае, если она включена. В настройке есть опция «Доступность», в свою очередь, проект и предоставление разрешения вашему классу обслуживания.

Примечание. Для выполнения методаGlobalAction (GLOBAL_ACTION_BACK) требуется Android 4.1+, если он не используется, можно встретить 4.0. Он закрывает окно сразу после AlertDialog,

Здесь пример кода:

  public class USSDService extends AccessibilityService { String TAG="USSDService"; @Override public void onAccessibilityEvent(AccessibilityEvent event) { //In my mobile the class name has been looks like this. if (event.getClassName().equals("com.mediatek.phone.UssdAlertActivity")) { //Method performGlobalAction (GLOBAL_ACTION_BACK) requires Android // 4.1+ performGlobalAction(GLOBAL_ACTION_BACK); } } @Override public void onInterrupt() { } @Override protected void onServiceConnected() { super.onServiceConnected(); Log.v(TAG, "onServiceConnected"); AccessibilityServiceInfo info = new AccessibilityServiceInfo(); info.flags = AccessibilityServiceInfo.DEFAULT; info.packageNames = new String[] {"com.android.phone"}; info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; setServiceInfo(info); } } 

В манифесте добавьте следующие вещи:

 <service android:name=".USSDService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter>