You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 12应用设置以太网静态IP触发IllegalArgumentException报错求助

问题

基于Android 12(AOSP 12)设备开发应用,尝试通过代码设置以太网静态IP。已在AndroidManifest.xml中申请包括WRITE_SETTINGS、WRITE_SECURE_SETTINGS在内的相关权限,且获取了系统写入权限,但运行时抛出java.lang.IllegalArgumentException: You cannot keep your settings in the secure settings错误。谷歌上的旧解决方案在Android 12已过时,寻求适配的解决办法。

相关代码片段

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private static final String KEY_ETH_IP_ADDRESS = "ethernet_ip_addr";
    private static final String KEY_ETH_HW_ADDRESS = "ethernet_hw_addr";
    private static final String KEY_ETH_NET_MASK = "ethernet_netmask";
    private static final String KEY_ETH_GATEWAY = "ethernet_gateway";
    private static final String KEY_ETH_DNS1 = "ethernet_dns1";
    private static final String KEY_ETH_DNS2 = "ethernet_dns2";
    private static final String KEY_ETH_MODE = "ethernet_mode_select";

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (Settings.System.canWrite(this)) {
                    Toast.makeText(this, "Hello World", Toast.LENGTH_SHORT).show();
                    ContentResolver cr = this.getContentResolver();
                    Settings.System.putString(cr,KEY_ETH_IP_ADDRESS, "10.xxx.xxx.15");
                    Settings.System.putString(cr,KEY_ETH_NET_MASK, "255.255.255.100");
                    Settings.System.putString(cr,KEY_ETH_GATEWAY, "10.xx.xx.100");
                    Settings.System.putString(cr,KEY_ETH_DNS1, "10.xxx.xx.10");
                    Settings.System.putString(cr,KEY_ETH_DNS2, "10.xxx.xx.10");
                } else {
                    Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
                    intent.setData(Uri.parse("package:" + this.getPackageName()));
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
        }
    }
}

AndroidManifest.xml权限配置

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:ignore="CoarseFineLocation" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" tools:ignore="ProtectedPermissions" />

报错信息

java.lang.IllegalArgumentException: You cannot keep your settings in the secure settings.
    at com.android.providers.settings.SettingsProvider.warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk(SettingsProvider.java:2266)
    at com.android.providers.settings.SettingsProvider.enforceRestrictedSystemSettingsMutationForCallingPackage(SettingsProvider.java:2036)
    at com.android.providers.settings.SettingsProvider.mutateSystemSetting(SettingsProvider.java:1889)
    at com.android.providers.settings.SettingsProvider.insertSystemSetting(SettingsProvider.java:1840)
    at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:462)
    ...

Process: com.xxx.test_staticip, PID: 3267
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.test_staticip/com.xxx.test_staticip.MainActivity}: java.lang.IllegalArgumentException: You cannot keep   your settings in the secure settings.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3707)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3864)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2253)
    ...

Caused by: java.lang.IllegalArgumentException: You cannot keep your settings in the secure settings.
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
    at android.content.ContentProviderProxy.call(ContentProviderNative.java:732)
    at android.provider.Settings$NameValueCache.putStringForUser(Settings.java:2867)
    at android.provider.Settings$System.putStringForUser(Settings.java:3572)
    at android.provider.Settings$System.putStringForUser(Settings.java:3556)
    at android.provider.Settings$System.putString(Settings.java:3529)
    at com.xxx.test_staticip.MainActivity.onCreate(MainActivity.java:84)
    at android.app.Activity.performCreate(Activity.java:8072)
    at android.app.Activity.performCreate(Activity.java:8052)
    ...
解决方案

核心原因

Android 12对系统设置的权限划分做了严格限制,原来存储在Settings.System中的以太网配置项,已经迁移到Settings.Global中。直接向Settings.System写入这些属于全局安全设置的项,会触发系统的权限校验错误。

具体修复步骤

  1. 替换设置存储对象:将所有Settings.System.putString调用替换为Settings.Global.putString,因为以太网的静态IP配置属于全局系统设置范畴。
  2. 确保WRITE_SECURE_SETTINGS权限生效:该权限是系统级权限,普通应用无法通过常规弹窗申请,必须通过adb命令授予:
    adb shell pm grant com.xxx.test_staticip android.permission.WRITE_SECURE_SETTINGS
    
    或者将应用签名为系统应用(需要对应设备的系统签名证书)。
  3. 先切换以太网模式为静态:设置IP前,需要先将以太网模式切换为静态,否则配置不会生效。通常静态模式的对应值为"1"(不同厂商可能有差异,可先通过Settings.Global.getString读取默认值确认)。

修改后的MainActivity代码示例

public class MainActivity extends AppCompatActivity {
    private static final String KEY_ETH_IP_ADDRESS = "ethernet_ip_addr";
    private static final String KEY_ETH_HW_ADDRESS = "ethernet_hw_addr";
    private static final String KEY_ETH_NET_MASK = "ethernet_netmask";
    private static final String KEY_ETH_GATEWAY = "ethernet_gateway";
    private static final String KEY_ETH_DNS1 = "ethernet_dns1";
    private static final String KEY_ETH_DNS2 = "ethernet_dns2";
    private static final String KEY_ETH_MODE = "ethernet_mode_select";

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查是否拥有写入系统设置权限
            if (Settings.System.canWrite(this)) {
                ContentResolver cr = this.getContentResolver();
                try {
                    // 先切换以太网为静态模式
                    Settings.Global.putString(cr, KEY_ETH_MODE, "1");
                    // 设置静态IP相关参数
                    Settings.Global.putString(cr, KEY_ETH_IP_ADDRESS, "10.xxx.xxx.15");
                    Settings.Global.putString(cr, KEY_ETH_NET_MASK, "255.255.255.100");
                    Settings.Global.putString(cr, KEY_ETH_GATEWAY, "10.xx.xx.100");
                    Settings.Global.putString(cr, KEY_ETH_DNS1, "10.xxx.xx.10");
                    Settings.Global.putString(cr, KEY_ETH_DNS2, "10.xxx.xx.10");
                    Toast.makeText(this, "静态IP设置成功", Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(this, "设置失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            } else {
                // 引导用户授予WRITE_SETTINGS权限
                Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                intent.setData(Uri.parse("package:" + this.getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者GNK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:50:32