参考cczhengv的博客

1.添加Settings入口

修改packages/apps/Settings/AndroidManifest.xml,仿照其他button的入口添加自己的button,

+        <activity android:name=".Settings$EthernetSettingsActivity"
+ android:label="@string/FSLETH">
+ <intent-filter >
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="com.android.settings.action.EXTRA_SETTINGS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ <meta-data
+ android:name="com.android.settings.category"
+ android:value="com.android.settings.category.ia.homepage" />
+ <meta-data
+ android:name="com.android.settings.order"
+ android:value="-150" />
+ <meta-data
+ android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.ethernet.EthernetSettings" />
+ <meta-data
+ android:name="com.android.settings.summary"
+ android:resource="@string/LZMTEST" />
+ <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
+ android:value="true" />
+ </activity>

".Settings$EthernetSettingsActivity":代表Setting包下的EthernetSettingsActivity类,这个类是空的也是需要手动添加的。

src/com/android/settings/Settings.java

public static class PrivateVolumeSettingsActivity extends SettingsActivity { /* empty */ }
public static class PublicVolumeSettingsActivity extends SettingsActivity { /* empty */ }
public static class WifiSettingsActivity extends SettingsActivity { /* empty */ }
+ public static class EthernetSettingsActivity extends SettingsActivity { /* empty */ }
public static class WifiSettings2Activity extends SettingsActivity { /* empty */ }
public static class WifiP2pSettingsActivity extends SettingsActivity { /* empty */ }
public static class AvailableVirtualKeyboardActivity extends SettingsActivity { /* empty */ }

2.实现以太网设置界面的fragment

上面我们只是添加了一个跳转入口,下面需要我们实现跳转进去后的fragment布局以及fragment逻辑。从上面可以看出来,我们通过指定FRAGMENT_CLASS实现逻辑跳转。跳转到com.android.settings.ethernet.EthernetSettings这个fragment。

+             <meta-data
+ android:name="com.android.settings.FRAGMENT_CLASS"
+ android:value="com.android.settings.ethernet.EthernetSettings" />

2.1EthernetSettings布局文件

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/ethernet_settings">

<SwitchPreference
android:key="ethernet"
android:title="@string/ethernet_quick_toggle_title"
android:summary="@string/open_ethernet"/>

<PreferenceScreen
android:dependency="ethernet"
android:fragment="com.android.settings.ethernet.EthernetStaticIP"
android:key="ethernet_static_ip"
android:title="@string/ethernet_static_ip_settings_title" />

</PreferenceScreen>

2.2EthernetSettings.java 实现以太网开关

package com.android.settings.ethernet;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.SystemProperties;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
import androidx.preference.CheckBoxPreference;
import androidx.preference.SwitchPreference;
import android.provider.Settings;
import android.provider.Settings.System;
import android.provider.Settings.Secure;
import android.util.Log;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.net.InetAddress;

import android.net.EthernetManager;
import android.net.StaticIpConfiguration;
import android.net.LinkAddress;
import android.net.IpConfiguration;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.R;

import android.os.Handler;
import android.database.ContentObserver;
import android.net.Uri;
/*
public static final int ETHERNET = 239;
public static final int ETHERNET_STATIC = 240;
K:\android6.0\kt8001_volte\6737_volte\frameworks\base\core\java\com\android\internal\logging\MetricsConstants.java

*/

public class EthernetSettings extends SettingsPreferenceFragment
implements Preference.OnPreferenceChangeListener{

private static final String TAG = "EthernetSettings";

private static final String USE_ETHERNET_SETTINGS = "ethernet";

public static final String IS_ETHERNET_OPEN = Settings.IS_ETHERNET_OPEN;
private SwitchPreference mUseEthernet;
private IntentFilter mIntentFilter;

private boolean isEthernetEnabled() {
return Settings.System.getInt(getActivity().getContentResolver(), IS_ETHERNET_OPEN,0) == 1 ? true : false;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.ethernet_settings);
mUseEthernet = (SwitchPreference) findPreference(USE_ETHERNET_SETTINGS);
mUseEthernet.setOnPreferenceChangeListener(this);
if(isEthernetEnabled()) {
mUseEthernet.setChecked(true);
} else {
mUseEthernet.setChecked(false);
}
/*File f = new File("sys/class/net/eth0/address");
if (f.exists()) {
mUseEthernet.setEnabled(true);
} else {
mUseEthernet.setEnabled(false);
}*/
}

@Override
public void onResume() {
super.onResume();
}

@Override
public int getMetricsCategory(){return MetricsEvent.ETHERNET;}

@Override
public void onPause() {
super.onPause();
}

@Override
public boolean onPreferenceChange(Preference preference, Object value) {
boolean result = true;
final String key = preference.getKey();
if (USE_ETHERNET_SETTINGS.equals(key)) {
Settings.System.putInt(getActivity().getContentResolver(), IS_ETHERNET_OPEN,
((Boolean) value) ? 1 : 0);
}

return result;
}

//for CheckBoxPreference
/*@Override
public boolean onPreferenceTreeClick(Preference preference) {
if (preference == mUseEthernet) {
boolean newState = mUseEthernet.isChecked();

if (newState) {
Settings.System.putInt(getActivity().getContentResolver(), IS_ETHERNET_OPEN,1);
} else {
Settings.System.putInt(getActivity().getContentResolver(), IS_ETHERNET_OPEN,0);
}
}
return super.onPreferenceTreeClick(preference);
}*/

}