項目中在后台發送通知,突然某一天測出在Android 7.0上通知發送失敗,那么根據提示,我們嘗試加了MANAGE_USERS權限,看起來是個系統級別權限,驗證后果然無效。接着在搜索后都無果,似乎大家都沒遇到過,很是詭異。
從報錯看可能跟系統用戶有關,也許關聯了什么權限沒有獲得。開始只能通過try/catch, 這樣在前台可以收到消息。那在后台還是有問題。
開始我有幾個懷疑點:
1、7.0 修改了Notification的構建方式。 但查看api更新說明,沒有提及。
2、當時測出問題是在Nexus6, 從這個權限名來看 MANAGE_USERS,懷疑與系統的用戶管理權限有關。
后來經過很長時間終於找到這個問題的根本原因。
首先重建一個Demo在7.0上測試一切正常,說明很有可能是我們自己工程的問題,后來發現在自定義的MyApplication有一個方法叫getUserId(), 而在Notification構建時發現竟然有一個相同的方法:
sdk 24(7.0代碼):
由於這個Context 在Builder構造的時候傳的是Application context, 所以很大可能就是和系統方法沖突了。
但是我又看了下,7.0以前的代碼也有同樣的方法,只是位置略有不同,至此還是不能解釋為什么只有7.0有問題。
sdk 23:
然后我又找出手機對應的代碼版本,7.0.0_r1, 有一段提交記錄:
正是由於加了 callingUserId != userId 這個權限判斷,才會拋出這個異常,雖然系統通知的流程我不太熟,但至此已經可以確認此問題的根本原因。
所以這個bug很巧,只有在7.0上,你的代碼里有這個方法的時候才會出現。那么改法就比較簡單了,修改自己的方法即可。