問題:
之前在開發作業的時候,在Android 12的環境下,不做任何處理,alarm應用中,鬧鐘響鈴時,alarm應用會crash,
報錯資訊:
java.lang.RuntimeException: Unable to start service
com.android.deskclock.alarms.AlarmService@c351e33 with Intent { act=START_ALARM
dat=content://com.android.deskclock/instances/44
cmp=com.android.deskclock/.alarms.AlarmService }: java.lang.SecurityException:
getCallState: Neither user 10141 nor current process has
android.permission.READ_PHONE_STATE.
鎖定出錯位置:
AlarmService中,在startAlarm()中呼叫了getCallState()方法來獲取phone的狀態時出現了crash
解決方案:
在Android6.0以后,呼叫getCallState()需要動態授予READ_PHONE_STATE權限(危險權限)
先在權限清單中加入READ_PHONE_STATE權限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
在應用的MainActivity中,加入動態授權的流程,一開始進入應用時,判斷是否授予READ_PHONE_STATE權限,
建議在onResume(每次打開這個activity都會加載onResume)中加入權限檢查,不要在onCreate中(只在第一次打開activity時,才會加載onCreate)加,第一次授予權限以后,在應用還沒被殺死的時候,再將權限拒絕,后面的問題無法避免,
@Override
public void onResume() {
super.onResume();
//如果沒有授予READ_PHONE_STATE權限
if(ContextCompat.checkSelfPermission(AlarmMainActivity.this, Manifest.
permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
//跳轉授權界面
ActivityCompat.requestPermissions(AlarmMainActivity.this, new
String[]{ Manifest.permission.READ_PHONE_STATE}, 1);
}else {
// 如果有其他權限(非危險權限)的判斷,可在這里進行操作
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode){
case 1:
if(grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED){
//如果沒授予此權限,則結束應用
//也可以做其它處理
finish();
}
break;
default:
}
}
附加問題:
本以為這個問題就這樣愉快滴解決了,結果這兩天,測驗來找我說Monkey測驗時,clock會發生crash
我看了一下log,發現還是這個問題,
我猜測要么是clock應用沒打開就運行了AlarmService.java,呼叫了getCallState()方法導致的crash,要么是READ_PHONE_STATE權限沒生效,
這個問題必須解決,如果clock發生crash太多次,會被殺死,程式就停止了,
ActivityManager: Force-killing crashed app com.android.deskclock at watcher's request
解決方法:
Android Q,去掉了READ_PHONE_STATE權限,取而代之的是一個系統級別的權限:READ_PHONE_STATE,這個權限不是危險權限,不需要動態授權,就不會出現crash了,
開發者網站請參考:
Android 10 中的隱私權變更 | Android 開發者 | Android Developers
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/404393.html
標籤:其他
