Android7.0源码添加默认wifi热点到“已保存的网络中“

        因为项目需求,需要修改源码,添加一个默认的WIFI热点,开机以后搜索到已知名字的热点后,能够自动连接上wifi.就相当于需要提前把wifi热点名字和密码添加到“已保存的网络中”。wifi链接过的热点都会将此热点的AP保存到配置文件wpa_supplicant.conf中,adb shell 进入data/misc/wifi/wpa_supplicant.conf 可以看到wifi链接信息。手机链接过得wifi热点可以忘记网络/取消保存,因此我们需要在开机启动的时候去添加代码,就算是忘记了或者恢复出厂设置这个热点依然存在。

直接上代码啦~

package com.android.settings.wifi;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.AuthAlgorithm;
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import com.android.settingslib.wifi.WifiTracker;

import android.widget.Button;
import android.widget.Toast;

public class PresetWifiInfoBootBroadcastReceiver  extends BroadcastReceiver{    
	private WifiManager wifiManager;
    private WifiTracker mWifiTracker;
	private String ACTION = "android.intent.action.BOOT_COMPLETED";
    private String TAG="PresetWifiInfoBootBroadcastReceiver";

    public enum WifiCipherType {
        WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID
    }
    
	@Override    
	public void onReceive(final Context context, Intent intent) {    
	  if (intent.getAction().equals(ACTION)){
 		Log.e(TAG,"preset wifi into android.intent.action.BOOT_COMPLETED");

	    mWifiTracker =new WifiTracker(context, null, true, true, false);
	    wifiManager = mWifiTracker.getManager();
            // WifiConfiguration configuration=createWifiInfo("网络名称SSID","WIFI密码",安全类型)
		WifiConfiguration configuration=createWifiInfo("icon","12345678",WifiCipherType.WIFICIPHER_WPA);
		wifiManager.save(configuration, null);
        Log.e(TAG,"PresetWifiInfoBootBroadcastReceiver  configuration"+configuration);

	  }    
	}
	
	private WifiConfiguration createWifiInfo(String SSID, String Password,
            WifiCipherType Type) {
        WifiConfiguration config = new WifiConfiguration();
        config.allowedAuthAlgorithms.clear();
        config.allowedGroupCiphers.clear();
        config.allowedKeyManagement.clear();
        config.allowedPairwiseCiphers.clear();
        config.allowedProtocols.clear();
        config.SSID = "\"" + SSID + "\"";
        // NOPASS
        if (Type == WifiCipherType.WIFICIPHER_NOPASS) {
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
        }
        // WEP
        if (Type == WifiCipherType.WIFICIPHER_WEP) {
            if (!TextUtils.isEmpty(Password)) {
                if (isHexWepKey(Password)) {
                    config.wepKeys[0] = Password;
                } else {
                    config.wepKeys[0] = "\"" + Password + "\"";
                }
            }
            config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
            config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
            config.allowedKeyManagement.set(KeyMgmt.NONE);
            config.wepTxKeyIndex = 0;
        }
        // WPA
        if (Type == WifiCipherType.WIFICIPHER_WPA) {
            config.preSharedKey = "\"" + Password + "\"";
            config.hiddenSSID = true;
            config.allowedAuthAlgorithms
                    .set(WifiConfiguration.AuthAlgorithm.OPEN);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            config.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.TKIP);
            // 此处需要修改否则不能自动重联
            // config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedPairwiseCiphers
                    .set(WifiConfiguration.PairwiseCipher.CCMP);
            config.status = WifiConfiguration.Status.ENABLED;
        }
        return config;
    }
    private static boolean isHexWepKey(String wepKey) {
        final int len = wepKey.length();
        // WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?)
        if (len != 10 && len != 26 && len != 58) {
            return false;
        }
        return isHex(wepKey);
    }
	   
    private static boolean isHex(String key) {
        for (int i = key.length() - 1; i >= 0; i--) {
            final char c = key.charAt(i);
            if (!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a'
                    && c <= 'f')) {
                return false;
            }
        }
        return true;
    }
}   

这个广播需要在AndroidManifest.xml中注册

path:base\packages\apps\Settings\AndroidManifest.xml

+    
+      
+            
+        
+    

path:base\packages\apps\Settings\src\com\android\settings\wifi\PresetWifiInfoBootBroadcastReceiver.java

+    PresetWifiInfoBootBroadcastReceiver.java

重点看39-43行。写好了就可以编译项目了,down好版本开机进入wifi界面就可以看到你添加的热点信息已经保存下来了,打开wifi会自动扫描列表,检测到热点并且是可用状态会自动链接。预置的wifi热点优先级是最高级,会优先链接。

也可以直接adb shell 查看配置文件wpa_supplicant.conf

你可能感兴趣的:(Android,MTK)