Как программно взаимодействовать с диалогом USSD в андроиде

Я хочу использовать диалоговое окно USSD, которое появляется после набора любого USSD-кода, например, *123#, в котором пользователю предлагается ввести номер опции для выполнения определенной задачи ( s) в зависимости от поставщиков SIM-карт. Мне нужно взаимодействовать с этим диалоговым окном, чтобы ввести текст в текстовое поле, заданное в нем программно.

Однако я могу прочитать USSD-ответ, который появляется в диалоговом окне оповещения после набора любого USSD-кода, используя AccessibilityService, и я показываю ответ в виде Toast, как показано в коде ниже. Я еще не нашел решения для взаимодействия с диалогом USSD.

public class UssdService extends AccessibilityService{
    public static String TAG = "USSD";

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        Log.d(TAG, "onAccessibilityEvent");
        String text = event.getText().toString();
        if (event.getClassName().equals("android.app.AlertDialog")) {
            Log.d(TAG, text);
            Toast.makeText(this, text, Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onInterrupt() {
    }

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Log.d(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>
    <meta-data android:name="android.accessibilityservice"
        android:resource="@xml/config_service" />
</service>

person zeeali    schedule 07.03.2016    source источник
comment
Если вы хотите установить событие щелчка, используйте приведенный ниже код List‹AccessibilityNodeInfo› list = nodeInfo.findAccessibilityNodeInfosByText(Send); для (узел AccessibilityNodeInfo: список) { node.performAction (AccessibilityNodeInfo.ACTION_CLICK); isDialogClose = Истина; }   -  person Varshil shah    schedule 29.05.2017


Ответы (2)


Для взаимодействия с диалогом USSD я использовал приведенный ниже код.

Я использовал приведенный ниже код для события клика:

List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("Send");
for (AccessibilityNodeInfo node : list) {
     node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}

Я использовал приведенный ниже код для setText в EditText. Это setText, где находится текущий фокус.

AccessibilityNodeInfo nodeInput = nodeInfo.findFocus(AccessibilityNodeInfo.FOCUS_INPUT);
Bundle bundle = new Bundle();        
bundle.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,pMPIN);
nodeInput.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT,bundle);
nodeInput.refresh();
person Varshil shah    schedule 29.05.2017
comment
Как получить информацию о узле? - person Jimmy Ilenloa; 14.02.2020
comment
Я бы хотел, чтобы вы дали более подробное объяснение. Я не знаю, как использовать ваш код, хотя он указывает мне правильное направление. - person Axes Grinds; 16.04.2021

Моя компания Hover разработала Android SDK, который использует службы специальных возможностей для запуска многоэтапных сеансов USSD и обеспечивает отображение происходить внутри вашего приложения. Базовый метод аналогичен тому, что изложен в принятом ответе, но в нем больше уровня абстракции, поддержки множества устройств, которые ведут себя по-разному, и он скрывает сеанс от пользователя.

Вы создаете конфигурации для служб USSD, запускаете сеанс из своего приложения и передаете любые необходимые переменные времени выполнения. Когда ответ возвращается, ваше приложение получает уведомление, и вы можете анализировать его по мере необходимости. Работает на Android 4.3 и выше.

SDK можно бесплатно интегрировать и использовать до тех пор, пока вы не достигнете больших масштабов. Пожалуйста, ознакомьтесь с нашей документами, чтобы начать работу.

(Раскрытие информации: я технический директор Hover)

person davkutalek    schedule 18.05.2020