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();
}
}
スクリーンショットアプリケーション:
私の問題を解決する方法は?
カスタムアクティビティからUSSDコードをダイヤルするのは、DIALまたはCALLインテントを使用して簡単ですが、返された結果を聞くのは、プラットフォーム内でUSSD呼び出しをインターセプトするための適切なサポートがAndroidにないためではなく、部分的です。文書化されていないサポートは、ネイティブダイヤラアプリケーション内に存在します。
まず、AndroidソースコードのPhoneUtilsクラスを確認します。リンクは4.0.3用ですが、この部分的なサポートは2.3以降存在していると思います。
具体的には、217行目を見ると、「com.Android.ussd.IExtendedNetworkService」という名前のインテントが作成されています。したがって、あなたがする必要があるのは、その意図に対応する独自のサービスを実装することです。サービスは、Androidフレームワークの一部である IExtendedNetworkService.aidl に従って実装する必要があります。
Aidlはいくつかの関数を公開しますが、私たちが気にするのはそのサービスのgetUserMessage(text)関数です。テキストは、USSD呼び出しから返される最終値です。
ノート:
Githubのサンプルコードをチェックアウトしてください ここ 。