33

我一直在試圖做一些類似於truecaller的應用程序,我的應用程序應該在通話掛斷後顯示屏幕。通過在manifest文件中註冊android.intent.action.PHONE_STATE隱式廣播來實現此目的。Android O:PHONE_STATE廣播限制

但由於Android O broadcast limitation,我將應用更改爲目標Android O,因此無法正常工作,而我正試圖找出該用例的替代解決方案。

在android文檔中建議的替代解決方案:Job scheduler或註冊servicecontext

作業調度程序:由於Job scheduler優化,接收回調會有一些延遲。因此,如果我們的應用程序屏幕在電話呼叫幾分鐘後顯示,並且每隔幾秒查詢一次新呼叫記錄導致電量耗盡問題,則會影響用戶體驗。

使用Java中的上下文註冊服務:即使應用程序未處於活動狀態,我也希望該行爲能夠正常工作。如果系統殺死了Service,這將不起作用。

註冊前臺服務:這需要一直向用戶顯示通知,這將成爲用戶的垃圾郵件,並且24/7全天候運行會佔用大量資源,從而無法實現廣播的全部目的侷限性。

請建議備用解決方案,以便用戶體驗保持不變。

在此先感謝

回答

2

由於沒有適當的解決方案可以從Android O中讀取PHONE_STATE,我們可以選擇的最好方法是從content provider的新通話記錄條目中觸發一個作業。由此,在呼叫結束之後,行爲被保持顯示屏幕(具有幾秒的延遲)。

注意:缺點是我們無法獲得電話呼叫的狀態(Ringing或off_the_hook等)。只有在將新通話記錄添加到系統數據庫後纔會收到回撥。

3

你只有一個解決方案,使用前景的服務和註冊在服務廣播接收機。

+0

我們期望更好的東西,因爲前臺服務需要顯示通知。你不覺得這會成爲用戶的垃圾郵件嗎?而且,全天候運行服務會消耗大量資源。 – Bob

+0

沒有其他解決方案。 – greywolf82

+0

+1我只想補充 - 通知並不是那麼糟糕。例如,LastPass密碼管理器爲其後臺服務24/7顯示它,並且它消耗的資源非常少。另外,如果屏幕上有「臉部」,FB信使將顯示通知。 –

0

對於我和我的製作應用程序,解決方案是避免將目標定位爲25或更高,直到出現更好的解決方法/ api。

如果您的應用定位到24或更低級別,那麼即使您的應用未運行,您也不會受到新的Implicit Broadcast Limitations的影響,並且您的應用仍可以收聽PHONE_STATE廣播。

的應用定位較低的API仍然可以下載並在新的Android版本的正常安裝,更新您的sdkTarget價值的唯一原因是,如果您的應用程序需要新的API使用。

0

對於ACTION_NEW_OUTGOING_CALL,似乎有broadcast exception,但對於來電(或通話結束時)不是一個。這似乎是一個錯誤,有一個傳出,但沒有一個傳入。還有的是在谷歌問題跟蹤提起bug report。希望他們的回答能夠澄清我們應該做的事情。

如果/當錯誤跟蹤程序更新時,我會更新此答案。