2011-06-14 56 views
20

我正在開發一個項目,該項目要求我的應用能夠在通話過程中在語音的上行頻率上發送DTMF音。通過上行鏈路呼叫發送DTMF音

我的2個條件是:

  • 我們不使用定製的Android平臺
  • 我們並不需要以root的手機

我花了好幾天做的我家庭作業,並且知道當前的SDK /標準API不支持通話中的DTMF發送。但是,通過使用com.android.internal.telephony中的相關類,我希望能夠模仿本機Phone應用程序如何執行此操作。我跟着this site on how to use internal APIs for standard 3rd party apps

我也爲自己設置了Android OS開發環境,並且能夠在模擬器上以調試模式運行電話應用程序來計算其內部工作。

我想盡各種辦法對一隻股票的標準仿真器,但我得到的錯誤是:

  1. 試圖安裝基於使用android.uid.phone的sharedUserId Phone.apk的源改名應用後,我得到了:

    Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

    毫無疑問,由於我沒有系統證書籤名它的事實。

  2. 在嘗試編寫基於來自Phone.apk的源代碼的相關DTMF音頻發送代碼的自定義應用後,在設置PhoneFactory時出現以下錯誤;

    java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.provider.Telephony.SPN_STRINGS_UPDATED.

    毫無疑問,由於我的應用程序沒有正確的權限,但AndroidManifest.xml中被設定與相同的權限Phone.apk。

我不知道我還能嘗試什麼。有沒有人有什麼建議?

在此先感謝, 西蒙。

回答

8

您採取了一種有趣的方法,我讚揚您的努力。不幸的是,您有一些保留的內部權限(顯然,例如SPN_STRINGS_UPDATED),您不允許將其用作應用程序開發人員,這或多或少違反了此方法。你可以嘗試刪除造成這種情況的代碼區域,但我相當肯定你會遇到阻塞問題。

因此,恐怕目前這是不可能的。有an open feature request on Android用於通過現有的電話發送DTMF音,但它已在那裏休眠近兩年。

我明白,這不能解決你的問題,但是請注意,您可以撥打號碼後直接發送DTMF音頻:

Intent i = new Intent("android.intent.action.CALL", 
         Uri.parse("tel://" + number + "," + dtmfTones)); 
5

簡單地說,你不會是能夠做到這一點,而不至少定製電話應用程序,該應用程序必須作爲系統用戶運行才能訪問調制解調器。爲了做到這一點,你必須根據你的手機。

爲了滿足您的要求,唯一可能的解決方案是增強Android平臺。我們就是這樣做的,在我們的補丁已經發送到AOSP項目:

https://android-review.googlesource.com/32820

https://android-review.googlesource.com/32821

目前,我們正在等待谷歌開發者閱讀並接受我們的貢獻。如果您有興趣,請讓Google知道各種AOSP列表(android-contrib,android-platform)。它有望加快審查速度。

最好的問候, 蓋爾蓋伊

+0

嘿,這個功能的狀態有任何改變嗎?我是否能幫助?我試圖理解ASOP網站的投票位置,但我放棄了。我甚至不明白,如果該功能被接受或卡住了?它的狀態是什麼? – 2014-07-19 22:20:39

+0

最新的修補程序集因拒絕在AOSP主服務器上合併而被拒絕。如果其他人可以選擇它,重新整合它並提交一個新的補丁集,那將會很好。 – 2015-01-12 10:55:06