android5.0以上的系统自带了ethernet service,默认开机就会启动,默认ip获取方式是动态分配,这里记录下android5.1增加ethernet设置界面设置ip获取方式及开关.
首先是界面方面要修改Settings增加ethernet设置界面
修改文件packages/apps/Settings/res/xml/dashboard_categories.xml在蓝牙后面加上如下代码
其中的EthernetSettings后面进行说明,然后增加string修改文件packages/apps/Settings/res/values/strings.xml
增加如下内容
Ethernet
Configure Ethernet device
Ethernet
Ethernet Devices:
Connection Type
DHCP
Static IP
DNS address
Gateway address
IP address
Ethernet
Turn on Ethernet
Ethernet configuration
Configure Ethernet devices
Netmask
Turn off Ethernet
Turn on Ethernet
Failed to set: Please enter the valid characters 0~255
can\'t be empty
Network prefix length
这是我修改完成后所要加的所有的string
接着修改文件packages/apps/Settings/src/com/android/settings/SettingsActivity.java增加
import com.android.settings.ethernet.EthernetSettings;//add by hclydao
然后在R.id.bluetooth_settings,后增加
R.id.ethernet_settings,//add by hclydao
在BluetoothSettings.class.getName(),后增加
EthernetSettings.class.getName(),//add by hclydao
接着修改文件packages/apps/Settings/src/com/android/settings/Settings.java
在public static class WirelessSettingsActivity extends SettingsActivity { /* empty */ }后增加
public static class EthernetSettingsActivity extends SettingsActivity { /* empty */ } //add by hclydao
这里面应该是声明与继承关系
接着修改
packages/apps/Settings/AndroidManifest.xml
这三个文件按照wifi的代码改就行了。
然后增加点击进去后的布局文件,增加
packages/apps/Settings/res/xml/ethernet_settings.xml
内容如下
然后增加了packages/apps/Settings/src/com/android/settings/ethernet/EthernetSettings.java
这是我最终的代码,这里就不贴上来了,下面我会给下载地址
编译后效果应该是这个样子的:
点击进去后会有一个Dialog布局,需要增加文件packages/apps/Settings/res/layout/eth_configure.xml
里面包括了dhcp与static ip的选择,以及static ip的设置
然后增加Settings/src/com/android/settings/ethernet/EthernetDialog.java
以及packages/apps/Settings/src/com/android/settings/ethernet/EthernetSettings.java
这些是具体的实现,最后我会给下载地址
最后出来的效果应该是这样的:
配制界面
增加这些修改和文件后,基本上就可以进行动态设置了。但是设置的关于ethernet的开关是没有作用的,所以这里增加开关的控制
修改文件frameworks/base/core/java/android/provider/Settings.java
在Settings数据库中增加一个ethernet的控制
public static final String ETHERNET_ON = "ethernet_on";//add by hclydao
增加这个以后需要更新api才能编译过,增加这个后在ethernet-service和Settings中ethernet中进行读写操作
修改frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java文件
在mHandler = new Handler(handlerThread.getLooper());后增加如下代码
int enable = Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.ETHERNET_ON,0);//add by hclydao
if(enable != EthernetManager.ETH_STATE_ENABLED) {
Log.i(TAG, "Ethernet is not enable");
return;
}
如果没有打开就直接返回,不启动Service后继的操作,然后增加两个接口
class TstartThread extends Thread {
public void run() {
Looper.prepare();
mTracker.start(mContext, mHandler);
mStarted.set(true);
Looper.loop();
}
}
public void Trackstart() { //add by hclydao
new TstartThread().start();
}
public void Trackstop() {
Log.i(TAG, "Stop Ethernet service");
Thread tstopthread = new Thread(new Runnable() {
public void run() {
Looper.prepare();
mTracker.stop();
mStarted.set(false);
Looper.loop();
}
});
tstopthread.start();
}
同时要修改frameworks/base/core/java/android/net/EthernetManager.java文件增加
public static final int ETH_STATE_UNKNOWN = 0;
public static final int ETH_STATE_DISABLED = 1;
public static final int ETH_STATE_ENABLED = 2;
public void start() {
try {
mService.Trackstart();
} catch (NullPointerException | RemoteException e) {
}
}
public void stop() {
try {
mService.Trackstop();
} catch (NullPointerException | RemoteException e) {
}
}
同时修改frameworks/base/core/java/android/net/IEthernetManager.aidl
增加
void Trackstart();//add by hclydao
void Trackstop();
提供给设置进行状态控制,这里基本功能就实现了。
跟踪测试时发现静态ip设置的时候有时候不成功,修改文件frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetNetworkFactory.java
增加
private Handler mHandler;
然后在
mContext = context;
后增加
mHandler = target;//add by hclydao
在if (!setStaticIpAddress(config.getStaticIpConfiguration())) {后增加
//if error then stop and restart add by hclydao
if((mContext != null) && (mHandler != null)) {
Log.d(TAG, "Setting static ip failed now restart");
stop();
start(mContext,mHandler);
}
如果设置失败,stop后重新start
然后在if (mNMService.getInterfaceConfig(iface).hasFlag("running")) {前面增加
if(!iface.equals("eth0"))//add by hclydao make sure the interface is eth0
continue;
这里只设置了一个设备名,为保存是eth0所以加上这句,防止意外.
最后来增加Systemui statusbar中的状态提示,这里只增加了两种状态,一种是连接成功,一种是连接不成功,简单点来
修改frameworks/base/packages/SystemUI/res/layout/signal_cluster_view.xml
在
android:layout_width="4dp"
前增加
修改文件frameworks/base/packages/SystemUI/res/values/strings.xml
增加
Ethernet connected.
Ethernet disconnected.
Ethernet connecting.
修改文件
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
增加
import android.net.EthernetManager;
在mWifiSignalController.notifyListeners();前面加上
cluster.setEthernetIndicators(false,R.drawable.ethernet_disconnected,R.string.accessibility_ethernet_disconnected);
在pushConnectivityToSignals函数中的
mWifiSignalController.setInetCondition(
mValidatedTransports.get(mWifiSignalController.getTransportType()) ? 1 : 0);
后面增加
//add by hclydao
int length = mSignalClusters.size();
int ethicon = R.drawable.ethernet_connecting;
int ethacc = R.string.accessibility_ethernet_connecting;
if(mValidatedTransports.get(TRANSPORT_ETHERNET)) {
ethicon = R.drawable.ethernet_connected;
ethacc = R.string.accessibility_ethernet_connected;
}
for (int i = 0; i < length; i++) {
mSignalClusters.get(i).setEthernetIndicators(mEthernetConnected, ethicon,ethacc);
}
//end add
在
void setIsAirplaneMode(boolean is, int airplaneIcon, int contentDescription);
后增加
public void setEthernetIndicators(boolean visible, int stateIcon, int contentDescription);
修改文件frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
增加
private boolean mEthernetVisible = false;//add by hclydao
private int mEthernetStateId = 0;
private int mEthernetDescription;
ViewGroup mWifiGroup,mEthernetGroup;//modify by hclydao
ImageView mVpn, mWifi, mAirplane, mNoSims,mEthernet;//modify by hclydao
在
mWifiAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer);
mWifiSignalSpacer = findViewById(R.id.wifi_signal_spacer);
mMobileSignalGroup = (LinearLayout) findViewById(R.id.mobile_signal_group);
后增加
mEthernetGroup = (ViewGroup) findViewById(R.id.ethernet_combo);//add by hclydao
mEthernet = (ImageView) findViewById(R.id.ethernet_state);
在
mWifi = null;
mAirplane = null;
后增加
mEthernetGroup = null;//add by hclydao
mEthernet = null;
增加函数
//add by hclydao
@Override
public void setEthernetIndicators(boolean visible, int stateIcon, int contentDescription) {
mEthernetVisible = visible;
mEthernetStateId = stateIcon;
mEthernetDescription = contentDescription;
apply();
}
在apply函数中
mWifiSignalSpacer.setVisibility(View.GONE);
}
后增加
if (mEthernetVisible && !mWifiVisible) {//add by hclydao
mEthernetGroup.setVisibility(View.VISIBLE);
mEthernet.setImageResource(mEthernetStateId);
mEthernetGroup.setContentDescription(mContext.getString(mEthernetDescription));
} else {
mEthernetGroup.setVisibility(View.GONE);
}
在boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode上增加
|| mEthernetVisible
最后效果图如下:
============================================
作者:hclydao
http://blog.csdn.net/hclydao
版权没有,但是转载请保留此段声明
============================================
参考文章:
http://blog.csdn.net/moyu123456789/article/details/50002099
http://my.oschina.net/hiliusl/blog/174973?fromerr=IPmtDOdk
相关源码下载地址:http://download.csdn.net/detail/hclydao/9472077
下载文件为zip文件,上传后自动在最后加了_ 下载后将_删除
有积分的麻烦支持下使用积分下载
没有积分的,想办法给点积分然后去github下载
CSDN升级排版就不改了
地址: https://github.com/hcly/android5.1.1-ethernet