admin管理员组

文章数量:1619294

    近几日,看Settings代码中的wifi部分,一时兴起,想自己通过调用WifiManager以及WifiConfiguration的相关的配置实现连接wifi热点以及创建wifi热点。

    软件平台:Android4.4

    硬件调试平台:MTK

第一个小应用是创建activity,通过点击btn控件,从而连接wifi热点的代码:

package com.kaka.connector;

import java.util.List;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.wifi.WifiConfiguration;
import android.wifi.WifiManager;
import android.wifi.ScanResult;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.util.Log;

public class ConnectActivity extends Activity {
private List<ScanResult> wifiList; 
private WifiManager wifiManager;
private List<String> passableHotsPot;
private WifiReceiver wifiReceiver; 
private boolean isConnected=false; 
private Button connect;
final private String TAG = "XINGSHI";


/* 监听热点变化 */
private final class WifiReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG, "onReceive..........\n");
        wifiList = wifiManager.getScanResults(); 
        if (wifiList == null || wifiList.size() == 0 || isConnected) return; 
        onReceiveNewNetworks(wifiList); 
    } 
}

@Override 
public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);

        wifiReceiver = new WifiReceiver(); 
        IntentFilter filter = new IntentFilter();
        filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(wifiReceiver, filter);

        init(); 
}


/* 初始化参数 */ 
public void init() { 
    Log.e(TAG, "init..........\n");
    setContentView(R.layout.activity_connect);
    connect=(Button)findViewById(R.id.connect); 
    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

     wifiManager.setWifiEnabled(true);

    //通过按钮事件搜索热点 
    connect.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
        wifiManager.startScan(); 
    } 
    }); 
}


/*当搜索到新的wifi热点时判断该热点是否符合规格*/ 
public void onReceiveNewNetworks(List<ScanResult> wifiList){ 
    Log.e(TAG, "onReceiveNewNetwork..........\n");
    passableHotsPot=new ArrayList<String>();
    for(ScanResult result:wifiList){ 
    Log.e(TAG, "" + result.SSID); 
    if((result.SSID).contains("vinci"))
        passableHotsPot.add(result.SSID); 
} synchronized (this) { 
    connectToHotpot();
}



    /*连接到热点*/
public void connectToHotpot(){
    Log.e(TAG, "connectToHotpot..........\n");
    if(passableHotsPot==null || passableHotsPot.size()==0) return;
    WifiConfiguration wifiConfig=this.setWifiParams(passableHotsPot.get(0));
    int wcgID = wifiManager.addNetwork(wifiConfig);
    boolean flag=wifiManager.enableNetwork(wcgID, true);
    isConnected=flag; 
    Log.e(TAG, "connect success? "+flag); 
}


/*设置要连接的热点的参数*/ 
public WifiConfiguration setWifiParams(String ssid){ 
    WifiConfiguration apConfig=new WifiConfiguration();
    apConfig.SSID="\""+ssid+"\""; 
    apConfig.preSharedKey="\"inspero2014\"";
    apConfig.hiddenSSID = true;
    apConfig.status = WifiConfiguration.Status.ENABLED;
    apConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
    apConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
    apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
    apConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
    apConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
    apConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 

    return apConfig;
}


@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    /*销毁时注销广播*/
    unregisterReceiver(wifiReceiver); 


代码中指定了要连接的wifi热点名称的字段,setWifiParams配置了密码以及协议等信息。


第二个应用通过创建actiity,点击相关控件完成wifi AP的创建,其他设备可以连接之。

package com.kaka.hotspot;

import android.app.Activity;
import java.lang.reflect.Method;
import android.content.Context;
import android.wifi.WifiConfiguration;
import android.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class HotspotActivity extends Activity {
    private WifiManager wifiManager;
    private Button open;
    private boolean flag=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // TODO Auto-generated method stub super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_connect);

        //获取wifi管理服务
        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);

        open=(Button)findViewById(R.id.open_hotspot); //通过按钮事件设置热点
        open.setOnClickListener(new View.OnClickListener() { 
    @Override
    public void onClick(View v) {
        //如果是打开状态就关闭,如果是关闭就打开 
        flag=!flag;
        setWifiApEnabled(flag); 
    } }); 

    // wifi热点开关
    public boolean setWifiApEnabled(boolean enabled) 
{

        if (enabled) {
        // disable WiFi in any case 
        //wifi和热点不能同时打开,所以打开热点的时候需要关闭wifi
        wifiManager.setWifiEnabled(false); } 
        try { 
           //热点的配置类 
           WifiConfiguration apConfig = new WifiConfiguration();
           //配置热点的名称(可以在名字后面加点随机数什么的) 
           apConfig.SSID = "NNNNBBBB";
           apConfig.hiddenSSID = true;    
           apConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
           apConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
           apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
           apConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
           apConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
           apConfig.status = WifiConfiguration.Status.ENABLED;   

          //配置热点的密码 
          apConfig.preSharedKey="12122112"; 
          //通过反射调用设置热点 
          Method method = wifiManager.getClass().getMethod( "setWifiApEnabled", WifiConfiguration.class, Boolean.TYPE);
          //返回热点打开状态
          return (Boolean) method.invoke(wifiManager, apConfig, enabled); } catch (Exception e) { return false; } 
    }

}

        流程简洁,不多做说明,有需要的同学可以把要连接的热点名称,密码以及要创建的wifi热点名称及密码等做成可编辑的模式,更加灵活,上述的两个例子均按固定的名称密码处理的。


⚠上述应用需要添加的相关权限:

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>


欢迎交流学习~~~




本文标签: 热点自己动手wifi