Android USSD UssdResponseCallback всегда терпит неудачу

Я пытаюсь использовать TelephonyManager.UssdResponseCallback и перехватывать USSD-запрос. Мой код:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 0);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                Handler handler = new Handler();

                TelephonyManager.UssdResponseCallback responseCallback = new TelephonyManager.UssdResponseCallback() {
                    @Override
                    public void onReceiveUssdResponse(TelephonyManager telephonyManager, String request, CharSequence response) {
                        super.onReceiveUssdResponse(telephonyManager, request, response);

                        Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onReceiveUssdResponseFailed(TelephonyManager telephonyManager, String request, int failureCode) {
                        super.onReceiveUssdResponseFailed(telephonyManager, request, failureCode);

                        Toast.makeText(MainActivity.this, String.valueOf(failureCode), Toast.LENGTH_SHORT).show();
                    }
                };

                telephonyManager.sendUssdRequest("*123#", responseCallback, handler);
            }
        });
    }

Но каждый раз получал "USSD_RETURN_FAILURE". Есть ли способ проверить USSD на эмуляторе? Или в моем коде есть ошибка?


person Hagakurje    schedule 11.11.2017    source источник
comment
Пожалуйста, скажите мне, что вы нашли решение для этого... Я столкнулся с той же проблемой не на эмуляторе (там не пробовал), а на моем смартфоне... Android oreo 8.1   -  person Jason Krs    schedule 27.05.2018
comment
На данный момент решения нет. Я открыл задачу issuetracker.google.com/issues/69251738 и купил новый телефон с Андроид 8...   -  person Hagakurje    schedule 28.05.2018
comment
Взгляните на это изображение и на 10-й ответ это обсуждение. Я обнаружил, что даже если мы получаем USSD_RETURN_FAILURE, запрос на самом деле работает, но результат из сети находится не в onReceiveUssdResponse, а в переопределенном методе sendUssdRequest, называемом onReceiveResult.... Если вы найдете способ обойти это, позвольте мне знаю ... Проблема может быть где-то в том, что sendUssdRequest не может разобрать предоставленную ему строку ussd   -  person Jason Krs    schedule 28.05.2018
comment
Проблема решена здесь. Я считаю, что предоставленный вами USSD-код открывает многосессионный USSD. Например, выберите 1 для баланса или 2 для данных соединения.... Я изменил свой USSD-запрос на код, который не запускает многосессионный USSD. Дальше все заработало, как и ожидалось... Обработчик ответа sendUssdRequest не знает, как работать с мультисессионным USSD-запросом, поэтому он просто идет на USSD_FAILURE_REQUEST   -  person Jason Krs    schedule 28.05.2018
comment
он отлично работает с USSD с одним сеансом, только проблема с USSD с несколькими сеансами, например, нажмите 1 для баланса, нажмите 2 для интернет-данных и т. д.   -  person vikas singh    schedule 03.04.2019
comment
Итак, что ты сделал? Вы создаете и завершаете сеансы?   -  person TheRealChx101    schedule 22.04.2019
comment
На эмуляторе не работает. На реальном устройстве работает.   -  person Hagakurje    schedule 23.04.2019
comment
@vikassingh с нетерпением ждет Android API, который обрабатывает многоэтапный сеанс USSD. тем временем я использую это решение, основанное на доступности диалоговое окно программно"> stackoverflow.com/questions/35793378/   -  person Abdu    schedule 01.07.2019
comment
Для тех, кто ищет способ, я нашел платформу, которая позволяет приложению обрабатывать многоэтапные сеансы USSD под названием AutoUssd. Вы можете проверить их сайт по адресу https://autoussd.com.   -  person Kwame Opare Asiedu    schedule 27.06.2021