web-dev-qa-db-ja.com

AndroidのUSSDコードから応答を取得する方法は?

Ussdコードを使用するアプリケーションを作成しました。 ussdのリクエストを送信したいのですが、データを取得して文字列に保存する方法がわかりません。

サンプルコード:

@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

私の問題を解決する方法は?

14
sr.farzad

カスタムアクティビティからUSSDコードをダイヤルするのは、DIALまたはCALLインテントを使用して簡単ですが、返された結果を聞くのは、プラットフォーム内でUSSD呼び出しをインターセプトするための適切なサポートがAndroidにないためではなく、部分的です。文書化されていないサポートは、ネイティブダイヤラアプリケーション内に存在します。

まず、AndroidソースコードのPhoneUtilsクラスを確認します。リンクは4.0.3用ですが、この部分的なサポートは2.3以降存在していると思います。

具体的には、217行目を見ると、「com.Android.ussd.IExtendedNetworkService」という名前のインテントが作成されています。したがって、あなたがする必要があるのは、その意図に対応する独自のサービスを実装することです。サービスは、Androidフレームワークの一部である IExtendedNetworkService.aidl に従って実装する必要があります。

Aidlはいくつかの関数を公開しますが、私たちが気にするのはそのサービスのgetUserMessage(text)関数です。テキストは、USSD呼び出しから返される最終値です。

ノート:

  • サービスはPhoneUtilsによってバインドされているため、電話の起動時にサービスを開始する必要があります。また、サービスを変更する場合は、電話を再起動する必要があります。
  • GetUserMessageからnullを返すと、ダイヤラはUSSD結果を表示しなくなりますが、ダイヤラを完全に非表示にする方法はありません。
  • 他の機能を使用して、通話中に表示されるテキストを変更することもできます。
  • これはUSSDプロンプト(メニュー)では機能しないようで、最終結果でのみ機能します。

Githubのサンプルコードをチェックアウトしてください ここ

2
Gondy