Как получить ответ от USSD-кода от Android?

Я написал приложение, которое использует ussd-код. Я хочу отправить запрос на ussd, но я не знаю, как получить данные и сохранить их в String.

образец кода:

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

    Button btn = (Button) findViewById(R.id.button1);

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            String encodedHash = Uri.encode("#");
            String ussd = "*141*1" + encodedHash;
            startActivityForResult(new Intent("android.intent.action.CALL",
                    Uri.parse("tel:" + ussd)), 1);

        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

    Toast.makeText(getApplicationContext(),
            "USSD: " + requestCode + "  " + resultCode + " ", 1).show();

    if (requestCode == 1) {

        if (resultCode == RESULT_OK) {
            // String result=data.getStringExtra("result");
            String dd = data.toString();
            Toast.makeText(getApplicationContext(), dd, 1).show();
        }

    }

Приложение для скриншотов: enter image description here

enter image description here

как решить мою проблему?

Ответ 1

Набор кода USSD из пользовательского действия выполняется прямо с использованием намерения DIAL или CALL, но прослушивание полученного результата не связано с тем, что Android не имеет надлежащей поддержки для перехвата вызовов USSD внутри платформы, но частичная, хотя и недокументированная поддержка существует внутри родного дозвонщик.

Для начала рассмотрим класс PhoneUtils в исходном коде Android. Ссылка для 4.0.3, но я считаю, что эта частичная поддержка присутствует с 2.3.

В частности, глядя на строку 217, создается намерение с именем "com.android.ussd.IExtendedNetworkService". Итак, что вам нужно сделать, это реализовать свой собственный сервис, который отвечает на это намерение. Сервис должен быть реализован в соответствии с IExtendedNetworkService.aidl, который является частью платформы Android.

Helpl предоставляет несколько функций, но тот, о котором мы заботимся, это функция getUserMessage (text) в этой службе. Текст является окончательным значением, возвращаемым вызовом USSD.

Заметки:

  • Поскольку услуга привязана к PhoneUtils, вам необходимо запустить службу при загрузке телефона. Это также означает, что для любой модификации услуги потребуется перезагрузка телефона.
  • Возврат null из getUserMessage будет подавлять дозвонщик, показывая результат USSD, но не может полностью скрывать дозвонщик.
  • Вы также можете использовать другие функции для изменения отображаемого текста во время разговора.
  • Кажется, что это не работает в USSD-подсказках (меню), только по окончательным результатам.

Оформить пример кода на github здесь.