2014-04-01 54 views
1

在我的Android應用程序發送USSD代碼,我使用下面Intent發送USSD碼(#144#73#):與字母字符

String baseUssd = Uri.encode("#") + "144" + Uri.encode("#"); 
StringBuilder builder = new StringBuilder(); 
builder.append(baseUssd); 
builder.append("73"); 
builder.append(Uri.encode("#")); 

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + builder.toString())); 

它的工作好。

我現在想的是發送此代碼:

#144#73MA#

我運行這個使用撥號盤,繼操作USSD菜單,即工作。 但是,如果我試圖這樣做以編程方式使用上述Intent沒有工作。

我知道當用撥號盤輸入代碼時不能使用字母字符,但我儘管這可以通過編程實現!

任何想法請!

編輯

當我試圖以編程方式發送的:#144#73MA#我注意到,撥號應用程序更改字母到其相應的撥號盤。這意味着撥號器轉變這樣的:#144#73MA#

這個#144#7362#:爲什麼呢?

因爲:

  • M相匹配的數字6
  • A相匹配的數字2
+0

_使用上述無法工作的意圖_ ---請定義它的工作原理。 – ozbek

+0

謝謝@shoerat,很高興看到您的評論!讓我編輯我的答案。 –

+0

文章編輯!謝謝 –

回答

5

含義撥號器轉變這樣的:#144#73MA#

至此#144#7362#:爲什麼?

我會盡力回答只爲爲什麼部分。

Intent.ACTION_CALLOutgoingCallBroadcaster類處理。如果你看一下processIntent()方法,就是有一段代碼(行438〜448在本文寫作):

String number = PhoneNumberUtils.getNumberFromIntent(intent, this); 
// Check the number, don't convert for sip uri 
// TODO put uriNumber under PhoneNumberUtils 
if (number != null) { 
    if (!PhoneNumberUtils.isUriNumber(number)) { 
     number = PhoneNumberUtils.convertKeypadLettersToDigits(number); 
     number = PhoneNumberUtils.stripSeparators(number); 
    } 
} else { 
    Log.w(TAG, "The number obtained from Intent is null."); 
} 

PhoneNumberUtils.convertKeypadLettersToDigits()字母轉換成等價的數字位數:

公共靜態串convertKeypadLettersToDigits(字符串輸入)

平移任何字母(即[A-ZA-Z])在指定的電話號碼成等價的數字位數,根據手機按鍵萊特r映射在ITU E.161和ISO/IEC 9995-8中描述。

返回
輸入字符串,以轉換爲使用電話鍵盤號映射位數字字母字母。例如,「1-800-GOOG-411」的輸入將返回「1-800-4664-411」。

希望這會有所幫助。

+0

謝謝,這非常有幫助!但請告訴我,有沒有可能改變這種行爲?通過覆蓋'OutgoingCallBroadcaster'方法或類似的東西?! –

+0

我不明白這是如何實現的,除非您可以使用其他特殊字符而不是字母;例如'〜&'而不是'MA' – ozbek

+0

不幸的是我不能。我正在製作一個應用程序來使用運營商的USSD代碼。我無法更改代碼! –