android5.1 增加ethernet设置(DHCP与Static ip)

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

这是我最终的代码,这里就不贴上来了,下面我会给下载地址
编译后效果应该是这个样子的:
android5.1 增加ethernet设置(DHCP与Static ip)_第1张图片

 

点击进去后会有一个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
这些是具体的实现,最后我会给下载地址
最后出来的效果应该是这样的:

android5.1 增加ethernet设置(DHCP与Static ip)_第2张图片

 

配制界面

android5.1 增加ethernet设置(DHCP与Static ip)_第3张图片

 

增加这些修改和文件后,基本上就可以进行动态设置了。但是设置的关于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:id="@+id/wifi_signal_spacer"
         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

最后效果图如下:

android5.1 增加ethernet设置(DHCP与Static ip)_第4张图片

 

android5.1 增加ethernet设置(DHCP与Static ip)_第5张图片

 

android5.1 增加ethernet设置(DHCP与Static ip)_第6张图片

 

android5.1 增加ethernet设置(DHCP与Static ip)_第7张图片

 

============================================
作者: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

 

 

你可能感兴趣的:(android系统)