2011-06-19 17 views
1

我試圖攔截一個撥出電話,並給予用戶一個選項來通過對話中止或繼續通話。在撥打電話前等待用戶輸入

第一步顯然是編寫一個BroadcastReceiver,它註冊了NEW_OUTGOING_CALL,這是我成功完成的。

我還創建了一個基於對話框主題的活動,向用戶顯示中止/繼續按鈕。在撥出電話時,我的當前代碼在廣播接收器中啓動時沒有問題。

我在掙扎的地方就是在用戶有機會做出迴應之前持有呼叫操作。雖然你可以從BroadcastReceiver的onReceive方法調用startActivity,但是這個調用會立即返回,在我的情況下,這意味着在對話被呈現時,調用會通過。

Android "Receiver Lifecycle" information對此有一個相當嚴格的拿,說:

特別是,你可能不會顯示一個對話框或者從 廣播接收器中的綁定到服務。對於前者,您應該改用NotificationManager API。 對於後者,可以使用Context.startService()向服務發送命令。

我明白阻塞的一般壞處以及在廣播接收器中顯示UI元素。我也明白,Android通常是異步的,因此,這有點奇怪。但是,在這種情況下,我覺得這是適當的。通知絕對不會解決我的問題。因此,我希望儘管谷歌說它不能完成,但StackOverflow的聰明人可以找到一種方法。

此外,谷歌語音似乎這樣做。

無論如何,我已經搜刮了StackOverflow和網絡的其餘部分來解決這個問題。雖然有很多相關的問題,但我還沒有找到一個能夠完全捕捉我的問題的性質,除了this one,這是死的,但唯一的答案完全錯過了這一點。

我考慮過的一個選擇是中止原始調用,然後在用戶選擇「繼續」時放置一個新調用。我假設我必須以某種方式告知我的廣播接收器不要在這種情況下顯示對話框。這應該是可行的,但感覺過於複雜。

在此先感謝您的幫助。

+0

一般來說,如果你試圖遊戲系統,你的代碼將變得複雜。我其實並沒有看到其他的解決方案,而是你所描述的解決方案。 – inazaruk

+0

更多信息。在API級別11(3.0)中,他們似乎通過引入BroadcastReceiver.PendingResult類和goAsync調用來解決了這個問題。有了這個,路徑是顯而易見的。不幸的是,我正在嘗試爲11之前的設備做到這一點。 – Scot

回答

0

我想你可以使用調用意圖過濾器來調用你的活動,如果用戶需要..這將創建一個詢問對話框,它將保持der,直到用戶給出一個輸入。如我錯了請糾正我。

+0

我不確定我完全理解您的回覆。我已經使用NEW_OUTGOING_CALL意圖來調用用戶撥打電話的代碼。這不是問題。問題出在用戶撥打電話後,我必須決定如何處理onReceive方法中的傳出呼叫,這隻會讓我有時間*啓動對話框,而不是等待用戶輸入。 – Scot

+0

嗯我猜這可能是問題的原因..請參閱廣播接收器作爲特定事件的註冊通知器。現在,您和默認的電話應用程序已註冊接收New_OUTGOING_CALL操作。所以它可以確保你的應用程序被調用來獲取特定的事件,但如果你的應用程序停止了某個彈出式應用程序,另一個應用程序(默認電話應用程序)將該調用作爲電話應用程序也會得到通知,因爲我們只是讓它離開sdk來調用應用程序。現在sdk通知所有已註冊的應用程序。 –

+0

類別。不過,這是一個「有序」廣播,這意味着它會一次處理一個註冊的接收器。 「默認電話」應用程序只有在完成後才能處理它。我可以永遠坐在接受者的位置,而且這個呼叫永遠不會消失。在等待用戶輸入時,我無法想出一種方法來坐在onReceive上,這是需要發生的。再次,查看BroadcastReceiver.goAsync以獲得解決API級別11中的確切問題的新方法。 – Scot