安卓11添加切换以太网动态静态方法

发布时间:2023年12月17日

客户要在app中自由切换动态,静态方法,直接把系统jar-api给他搞了半天搞不定,只有在系统里给他实现一个接口,方法如下:

Index: packages/apps/Settings/AndroidManifest.xml
===================================================================
--- packages/apps/Settings/AndroidManifest.xml	(revision 868)
+++ packages/apps/Settings/AndroidManifest.xml	(revision 869)
@@ -5,7 +5,7 @@
         android:sharedUserId="android.uid.system">
 
     <original-package android:name="com.android.settings" />
-
+     <uses-permission android:name="android.net.action.ETHERNET_IP_CHANGED"/>
     <uses-permission android:name="android.permission.REQUEST_NETWORK_SCORES" />
     <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
@@ -3504,6 +3504,14 @@
             </intent-filter>/>
         </receiver>
 
+	<receiver android:name=".ethernet.EtherentBoardcastReceiver"
+			 android:enabled="true"
+			 android:exported="true">
+             <intent-filter android:priority="1000">
+                <action android:name="android.net.action.ETHERNET_IP_CHANGED" />
+            </intent-filter>
+        </receiver>
+
         <!-- This is the longest AndroidManifest.xml ever. -->
     </application>
 </manifest>
Index: packages/apps/Settings/src/com/android/settings/ethernet/EtherentBoardcastReceive.java
===================================================================
--- packages/apps/Settings/src/com/android/settings/ethernet/EtherentBoardcastReceive.java     (nonexistent)
+++ packages/apps/Settings/src/com/android/settings/ethernet/EtherentBoardcastReceive.java     (revision 869)
@@ -0,0 +1,220 @@
+package com.android.settings.ethernet;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.admin.DevicePolicyManager;
+import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.PreferenceScreen;
+import android.provider.SearchIndexableResource;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.content.Intent;
+
+import androidx.preference.SwitchPreference;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.File;
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import java.util.regex.Pattern;
+import java.lang.Integer;
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.Preference.OnPreferenceClickListener;
+
+import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
+
+
+/*for 5.0*/
+import android.net.EthernetManager;
+import android.net.IpConfiguration;
+import android.net.IpConfiguration.IpAssignment;
+import android.net.IpConfiguration.ProxySettings;
+import android.net.wifi.SupplicantState;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.net.StaticIpConfiguration;
+import android.net.NetworkUtils;
+import android.net.LinkAddress;
+import android.net.LinkProperties;
+import android.widget.Toast;
+//import android.preference.ListPreference;
+//import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
+
+import com.android.settings.ethernet.ethernet_static_ip_dialog;
+public class EtherentBoardcastReceiver extends BroadcastReceiver  {
+	private static final String TAG = "EtherentBoardcastReceiver";
+	 
+	private  static String mEthMode = null
+    private  static String mEthIpAddress = null;
+    private  static String mEthNetmask = null;
+    private  static String mEthGateway = null;
+    private  static String mEthdns1 = null;
+    private  static String mEthdns2 = null;
+
+    private final static String nullIpInfo = "0.0.0.0";
+	private String mIfaceName;
+	 @Override
+    public void onReceive(Context context, Intent intent) {
+
+			IpConfiguration mIpConfiguration;
+			StaticIpConfiguration mStaticIpConfiguration;
+			String action = intent.getAction();
+		    Log.i(TAG, "receive a new action : " + action);
+			
+			EthernetManager mEthManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);
+			if(mEthManager == null){
+				Log.i(TAG, "fail to getSystemService :  "+Context.ETHERNET_SERVICE);
+			}
+
+		  mStaticIpConfiguration =new StaticIpConfiguration();
+		  getNetConfigFromIntent(intent);
+		 /*
+		  * get ip address, netmask,dns ,gw etc.
+		  */
+		String[] ifaces = mEthManager.getAvailableInterfaces();
+        if (ifaces.length > 0) {
+            mIfaceName = ifaces[0];//"eth0";
+        }
+        if (null == mIfaceName) {
+            Log.e(TAG, "get ethernet ifaceName failed");
+            
+        }
+
+
+		if (mEthMode  == null ||mEthMode.equals("static"))
+		{
+			 Inet4Address inetAddr = getIPv4Address(this.mEthIpAddress);
+			int prefixLength = maskStr2InetMask(this.mEthNetmask); 
+			InetAddress gatewayAddr = getIPv4Address(this.mEthGateway); 
+			InetAddress dnsAddr1 = getIPv4Address(this.mEthdns1);
+			InetAddress dnsAddr2 = getIPv4Address(this.mEthdns2);
+			if(inetAddr ==null || gatewayAddr == null || prefixLength <= 0  ){
+				  Log.e(TAG,"ip,mask or dnsAddr is wrong");
+				  return ;
+			}
+			if (inetAddr.getAddress().toString().isEmpty() || prefixLength ==0 || gatewayAddr.toString().isEmpty()
+			  ) {
+				   Log.e(TAG,"ip,mask or dnsAddr is wrong");
+				  return ;
+			}
+			  
+			mStaticIpConfiguration.ipAddress = new LinkAddress(inetAddr, prefixLength);
+			mStaticIpConfiguration.gateway=gatewayAddr;
+			if(dnsAddr1 != null && !dnsAddr1.toString().isEmpty())
+				mStaticIpConfiguration.dnsServers.add(dnsAddr1);
+			if(dnsAddr2 != null && !dnsAddr2.toString().isEmpty())
+				mStaticIpConfiguration.dnsServers.add(dnsAddr2);
+		
+			mIpConfiguration=new IpConfiguration(IpAssignment.STATIC, ProxySettings.NONE,mStaticIpConfiguration,null);  
+			mEthManager.setConfiguration(mIfaceName, mIpConfiguration); 
+		}else{
+			mEthManager.setConfiguration(mIfaceName, new IpConfiguration(IpAssignment.DHCP, ProxySettings.NONE,null,null));
+		}
+       
+		//
+		
+    }
+	
+	private void getNetConfigFromIntent(Intent intent){
+		Bundle bundle = intent.getExtras();
+        if (bundle.getString("netMode") != null)
+			this.mEthMode = bundle.getString("netMode");
+		if (bundle.getString("ipaddr") != null)
+			this.mEthIpAddress = bundle.getString("ipaddr");
+		if (bundle.getString("netMask")!= null)
+			this.mEthNetmask = bundle.getString("netMask");
+		if (bundle.getString("gateway")!= null)
+			this.mEthGateway = bundle.getString("gateway");
+		if (bundle.getString("dns1") != null)
+			this.mEthdns1 = bundle.getString("dns1");
+		if (bundle.getString("dns2") != null)
+			this.mEthdns2 = bundle.getString("dns2");
+	}
+	 private Inet4Address getIPv4Address(String text) {
+        try {
+            return (Inet4Address) NetworkUtils.numericToInetAddress(text);
+        } catch (IllegalArgumentException|ClassCastException e) {
+            return null;
+        }
+    }
+
+	 /*
+     * convert subMask string to prefix length
+     */
+    private int maskStr2InetMask(String maskStr) {
+    	StringBuffer sb ;
+    	String str;
+    	int inetmask = 0; 
+    	int count = 0;
+    	/*
+    	 * check the subMask format
+    	 */
+      	Pattern pattern = Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$");
+    	if (pattern.matcher(maskStr).matches() == false) {
+    		Log.e(TAG,"subMask is error");
+    		return 0;
+    	}
+    	
+    	String[] ipSegment = maskStr.split("\\.");
+    	for(int n =0; n<ipSegment.length;n++) {
+    		sb = new StringBuffer(Integer.toBinaryString(Integer.parseInt(ipSegment[n])));
+    		str = sb.reverse().toString();
+    		count=0;
+    		for(int i=0; i<str.length();i++) {
+    			i=str.indexOf("1",i);
+    			if(i==-1)  
+    				break;
+    			count++;
+    		}
+    		inetmask+=count;
+    	}
+    	return inetmask;
+    }
+
+
+
+}
+
文章来源:https://blog.csdn.net/a_348647621/article/details/134971178
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。