2013-09-28 47 views
13

我已經編寫了一個使用ussd代碼的應用程序。我想發送一個ussd的請求,但我不知道如何獲取數據並將其保存在字符串中。如何獲得來自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

使用DIAL或CALL意圖直接撥打來自定製活動的USSD代碼,但收聽返回的結果並非因爲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攔截器的工作示例項目嗎?我有一個問題,無法將aidl文件導入到我的java類 – HendraWD

相關問題