【原創】android 7.0 通知報錯 java.lang.SecurityException: You need MANAGE_USERS permission to: check if specified user a managed profile outside your profile group


項目中在后台發送通知,突然某一天測出在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上,你的代碼里有這個方法的時候才會出現。那么改法就比較簡單了,修改自己的方法即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM