我試圖攔截一個撥出電話,並給予用戶一個選項來通過對話中止或繼續通話。在撥打電話前等待用戶輸入
第一步顯然是編寫一個BroadcastReceiver,它註冊了NEW_OUTGOING_CALL,這是我成功完成的。
我還創建了一個基於對話框主題的活動,向用戶顯示中止/繼續按鈕。在撥出電話時,我的當前代碼在廣播接收器中啓動時沒有問題。
我在掙扎的地方就是在用戶有機會做出迴應之前持有呼叫操作。雖然你可以從BroadcastReceiver的onReceive方法調用startActivity,但是這個調用會立即返回,在我的情況下,這意味着在對話被呈現時,調用會通過。
的Android "Receiver Lifecycle" information對此有一個相當嚴格的拿,說:
特別是,你可能不會顯示一個對話框或者從 廣播接收器中的綁定到服務。對於前者,您應該改用NotificationManager API。 對於後者,可以使用Context.startService()向服務發送命令。
我明白阻塞的一般壞處以及在廣播接收器中顯示UI元素。我也明白,Android通常是異步的,因此,這有點奇怪。但是,在這種情況下,我覺得這是適當的。通知絕對不會解決我的問題。因此,我希望儘管谷歌說它不能完成,但StackOverflow的聰明人可以找到一種方法。
此外,谷歌語音似乎這樣做。
無論如何,我已經搜刮了StackOverflow和網絡的其餘部分來解決這個問題。雖然有很多相關的問題,但我還沒有找到一個能夠完全捕捉我的問題的性質,除了this one,這是死的,但唯一的答案完全錯過了這一點。
我考慮過的一個選擇是中止原始調用,然後在用戶選擇「繼續」時放置一個新調用。我假設我必須以某種方式告知我的廣播接收器不要在這種情況下顯示對話框。這應該是可行的,但感覺過於複雜。
在此先感謝您的幫助。
一般來說,如果你試圖遊戲系統,你的代碼將變得複雜。我其實並沒有看到其他的解決方案,而是你所描述的解決方案。 – inazaruk
更多信息。在API級別11(3.0)中,他們似乎通過引入BroadcastReceiver.PendingResult類和goAsync調用來解決了這個問題。有了這個,路徑是顯而易見的。不幸的是,我正在嘗試爲11之前的設備做到這一點。 – Scot