首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

華為手機 SecurityException: Permission denial 解決:補全 WRITE_SETTINGS 權限

     編輯:程式設計綜合問答

應用在華為手機後台運行時拋出 `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)
    ...

解決方案

1. AndroidManifest.xml 添加權限聲明

<uses-permission android:name="android.permission.WRITE_SETTINGS" 
    tools:ignore="ProtectedPermissions" />
> `tools:ignore="ProtectedPermissions"` 可抑制 Lint 對此敏感權限的警告(API 23+ 該權限為特殊權限,需用戶手動授權)。

2. Android 6.0+ (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 {
                // 用戶拒絕,提示無法使用相關功能
            }
        }
    }
}

3. 關於 `Unknown URL content://icc/adn1` 錯誤

此錯誤源於華為電話模塊對 SIM 聯系人 URI (`content://icc/adn1`) 的內部處理,**通常不影響主流功能**,屬於系統層兼容性日誌噪音。重點解決 `WRITE_SETTINGS` 即可消除崩潰。

最佳實踐總結

  1. Manifest 聲明權限。
  2. 運行時檢查 `Settings.System.canWrite(context)`,未授權則跳轉 `ACTION_MANAGE_WRITE_SETTINGS` 頁面。
  3. 在需要修改系統設置(如亮度、音量、定位模式)的代碼前調用檢查方法。
  4. 華為/小米/OPPO/vivo 等國產 ROM 權限管控更嚴,**測試必須覆蓋主流廠商機型**。

補全權限聲明與動態授權引導,即可解決華為手機上的 SecurityException 崩潰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved