2013-09-28 26 views
13

私はussdコードを使用するアプリケーションを作成しました。 ussdのリクエストを送信したいが、データを取得してStringに保存する方法がわからない。Androidから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

どのように私の問題を解決するには?

+0

問題を解決する方法を見つけましたか? – gkiko

+0

いいえ!私はいません...... –

+0

https://code.google.com/p/android/issues/detail?id=57120#c14 – gkiko

答えて

2

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

まず、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 hereのサンプルコードを参照してください。

+0

この質問に答える関連コードを投稿できますか?最終的な回答は、ソース参照と一緒にサイトに掲載することをお勧めします。これは、SOをプログラミングの質問に「終わり」にするためです。 –

+1

私は既に関連するコードが必要なgithubリポジトリへのリンクを追加しました。リポジトリをチェックアウトする方が良いでしょう。 [こちら](https://github.com/alaasalman/ussdinterceptor)をクリックしてコードを確認してください。 – Gondy

+0

@GondyはあなたのUSSDインターセプタを使用する実用的なサンプルプロジェクトを作れますか?私はJavaクラスにaidlファイルをインポートできない問題があります – HendraWD

関連する問題