應用在華為手機後台運行時拋出 `java.lang.SecurityException: Permission denial: writing to settings requires android.permission.WRITE_SETTINGS`,並在日誌中出現大量 `Unknown URL content://icc/adn1` 錯誤。核心原因是**缺少 `WRITE_SETTINGS` 權限聲明**,且華為 ROM 對權限管控更嚴格。
java.lang.SecurityException: Permission denial: writing to settings requires android.permission.WRITE_SETTINGS
at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:685)
...
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
> `tools:ignore="ProtectedPermissions"` 可抑制 Lint 對此敏感權限的警告(API 23+ 該權限為特殊權限,需用戶手動授權)。
`WRITE_SETTINGS` 屬於**特殊權限**,不走常規 `requestPermissions` 流程,需引導用戶到系統設置頁面授權:
private static final int REQUEST_WRITE_SETTINGS = 200;
private void checkWriteSettingsPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.System.canWrite(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_WRITE_SETTINGS);
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_WRITE_SETTINGS) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.System.canWrite(this)) {
// 用戶授權成功,繼續業務邏輯
} else {
// 用戶拒絕,提示無法使用相關功能
}
}
}
}
此錯誤源於華為電話模塊對 SIM 聯系人 URI (`content://icc/adn1`) 的內部處理,**通常不影響主流功能**,屬於系統層兼容性日誌噪音。重點解決 `WRITE_SETTINGS` 即可消除崩潰。
補全權限聲明與動態授權引導,即可解決華為手機上的 SecurityException 崩潰。