Android 连接Wifi和创建Wifi热点的实例
本文实例讲述了连接Wifi和创建Wifi热点的方法。分享给大家供大家参考,具体如下:
android的热点功能不可见,用了反射的技术搞定之外。
Eclipse设置语言为utf-8才能查看中文注释
上代码:
MainActivity.java
packagecom.widget.hotspot;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.util.Log;
importandroid.view.Menu;
importandroid.view.View;
importandroid.widget.Button;
publicclassMainActivityextendsActivity{
publicstaticfinalStringTAG="MainActivity";
privateButtonmBtn1,mBtn2;
privateWifiAdminmWifiAdmin;
privateContextmContext=null;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
mContext=this;
setContentView(R.layout.activity_main);
mBtn1=(Button)findViewById(R.id.button1);
mBtn2=(Button)findViewById(R.id.button2);
mBtn1.setText("点击连接Wifi");
mBtn2.setText("点击创建Wifi热点");
mBtn1.setOnClickListener(newButton.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
mWifiAdmin=newWifiAdmin(mContext){
@Override
publicvoidmyUnregisterReceiver(BroadcastReceiverreceiver){
//TODOAuto-generatedmethodstub
MainActivity.this.unregisterReceiver(receiver);
}
@Override
publicIntentmyRegisterReceiver(BroadcastReceiverreceiver,
IntentFilterfilter){
//TODOAuto-generatedmethodstub
MainActivity.this.registerReceiver(receiver,filter);
returnnull;
}
@Override
publicvoidonNotifyWifiConnected(){
//TODOAuto-generatedmethodstub
Log.v(TAG,"haveconnectedsuccess!");
Log.v(TAG,"###############################");
}
@Override
publicvoidonNotifyWifiConnectFailed(){
//TODOAuto-generatedmethodstub
Log.v(TAG,"haveconnectedfailed!");
Log.v(TAG,"###############################");
}
};
mWifiAdmin.openWifi();
mWifiAdmin.addNetwork(mWifiAdmin.createWifiInfo("YOU_WIFI","MM123456",WifiAdmin.TYPE_WPA));
}
});
mBtn2.setOnClickListener(newButton.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
WifiApAdminwifiAp=newWifiApAdmin(mContext);
wifiAp.startWifiAp("\"HotSpot\"","hhhhhh123");
}
});
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.activity_main,menu);
returntrue;
}
@Override
publicvoidonResume(){
super.onResume();
Log.d("Rssi","Registered");
}
@Override
publicvoidonPause(){
super.onPause();
Log.d("Rssi","Unregistered");
}
}
WifiAdmin.java
packagecom.widget.hotspot;
importjava.util.List;
importjava.util.Timer;
importjava.util.TimerTask;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.net.ConnectivityManager;
importandroid.net.NetworkInfo;
importandroid.net.NetworkInfo.DetailedState;
importandroid.net.wifi.ScanResult;
importandroid.net.wifi.WifiConfiguration;
importandroid.net.wifi.WifiInfo;
importandroid.net.wifi.WifiManager;
importandroid.net.wifi.WifiManager.WifiLock;
importandroid.util.Log;
publicabstractclassWifiAdmin{
privatestaticfinalStringTAG="WifiAdmin";
privateWifiManagermWifiManager;
privateWifiInfomWifiInfo;
//扫描出的网络连接列表
privateList<ScanResult>mWifiList;
privateList<WifiConfiguration>mWifiConfiguration;
privateWifiLockmWifiLock;
privateStringmPasswd="";
privateStringmSSID="";
privateContextmContext=null;
publicWifiAdmin(Contextcontext){
mContext=context;
//取得WifiManager对象
mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
//取得WifiInfo对象
mWifiInfo=mWifiManager.getConnectionInfo();
Log.v(TAG,"getIpAddress="+mWifiInfo.getIpAddress());
}
//打开WIFI
publicvoidopenWifi(){
if(!mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(true);
}
}
//关闭WIFI
publicvoidcloseWifi(){
if(mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(false);
}
}
publicabstractIntentmyRegisterReceiver(BroadcastReceiverreceiver,IntentFilterfilter);
publicabstractvoidmyUnregisterReceiver(BroadcastReceiverreceiver);
publicabstractvoidonNotifyWifiConnected();
publicabstractvoidonNotifyWifiConnectFailed();
//添加一个网络并连接
publicvoidaddNetwork(WifiConfigurationwcg){
register();
WifiApAdmin.closeWifiAp(mContext);
intwcgID=mWifiManager.addNetwork(wcg);
booleanb=mWifiManager.enableNetwork(wcgID,true);
}
publicstaticfinalintTYPE_NO_PASSWD=0x11;
publicstaticfinalintTYPE_WEP=0x12;
publicstaticfinalintTYPE_WPA=0x13;
publicvoidaddNetwork(Stringssid,Stringpasswd,inttype){
if(ssid==null||passwd==null||ssid.equals("")){
Log.e(TAG,"addNetwork()##nullpointererror!");
return;
}
if(type!=TYPE_NO_PASSWD&&type!=TYPE_WEP&&type!=TYPE_WPA){
Log.e(TAG,"addNetwork()##unknowntype="+type);
}
stopTimer();
unRegister();
addNetwork(createWifiInfo(ssid,passwd,type));
}
privateBroadcastReceivermBroadcastReceiver=newBroadcastReceiver(){
@Override
publicvoidonReceive(Contextcontext,Intentintent){
//TODOAuto-generatedmethodstub
if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)){
Log.d(TAG,"RSSIchanged");
//有可能是正在获取,或者已经获取了
Log.d(TAG,"intentis"+WifiManager.RSSI_CHANGED_ACTION);
if(isWifiContected(mContext)==WIFI_CONNECTED){
stopTimer();
onNotifyWifiConnected();
unRegister();
}elseif(isWifiContected(mContext)==WIFI_CONNECT_FAILED){
stopTimer();
closeWifi();
onNotifyWifiConnectFailed();
unRegister();
}elseif(isWifiContected(mContext)==WIFI_CONNECTING){
}
}
}
};
privatefinalintSTATE_REGISTRING=0x01;
privatefinalintSTATE_REGISTERED=0x02;
privatefinalintSTATE_UNREGISTERING=0x03;
privatefinalintSTATE_UNREGISTERED=0x04;
privateintmHaveRegister=STATE_UNREGISTERED;
privatesynchronizedvoidregister(){
Log.v(TAG,"register()##mHaveRegister="+mHaveRegister);
if(mHaveRegister==STATE_REGISTRING
||mHaveRegister==STATE_REGISTERED){
return;
}
mHaveRegister=STATE_REGISTRING;
myRegisterReceiver(mBroadcastReceiver,newIntentFilter(WifiManager.RSSI_CHANGED_ACTION));
mHaveRegister=STATE_REGISTERED;
startTimer();
}
privatesynchronizedvoidunRegister(){
Log.v(TAG,"unRegister()##mHaveRegister="+mHaveRegister);
if(mHaveRegister==STATE_UNREGISTERED
||mHaveRegister==STATE_UNREGISTERING){
return;
}
mHaveRegister=STATE_UNREGISTERING;
myUnregisterReceiver(mBroadcastReceiver);
mHaveRegister=STATE_UNREGISTERED;
}
privateTimermTimer=null;
privatevoidstartTimer(){
if(mTimer!=null){
stopTimer();
}
mTimer=newTimer(true);
//mTimer.schedule(mTimerTask,0,20*1000);//20s
mTimer.schedule(mTimerTask,30*1000);
}
privateTimerTaskmTimerTask=newTimerTask(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
Log.e(TAG,"timerout!");
onNotifyWifiConnectFailed();
unRegister();
}
};
privatevoidstopTimer(){
if(mTimer!=null){
mTimer.cancel();
mTimer=null;
}
}
@Override
protectedvoidfinalize(){
try{
super.finalize();
unRegister();
}catch(Throwablee){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicWifiConfigurationcreateWifiInfo(StringSSID,Stringpassword,inttype){
Log.v(TAG,"SSID="+SSID+"##Password="+password+"##Type="+type);
WifiConfigurationconfig=newWifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID="\""+SSID+"\"";
WifiConfigurationtempConfig=this.IsExsits(SSID);
if(tempConfig!=null){
mWifiManager.removeNetwork(tempConfig.networkId);
}
//分为三种情况:1没有密码2用wep加密3用wpa加密
if(type==TYPE_NO_PASSWD){//WIFICIPHER_NOPASS
config.wepKeys[0]="";
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex=0;
}elseif(type==TYPE_WEP){//WIFICIPHER_WEP
config.hiddenSSID=true;
config.wepKeys[0]="\""+password+"\"";
config.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex=0;
}elseif(type==TYPE_WPA){//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;
}
returnconfig;
}
publicstaticfinalintWIFI_CONNECTED=0x01;
publicstaticfinalintWIFI_CONNECT_FAILED=0x02;
publicstaticfinalintWIFI_CONNECTING=0x03;
/**
*判断wifi是否连接成功,不是network
*
*@paramcontext
*@return
*/
publicintisWifiContected(Contextcontext){
ConnectivityManagerconnectivityManager=(ConnectivityManager)context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfowifiNetworkInfo=connectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
Log.v(TAG,"isConnectedOrConnecting="+wifiNetworkInfo.isConnectedOrConnecting());
Log.d(TAG,"wifiNetworkInfo.getDetailedState()="+wifiNetworkInfo.getDetailedState());
if(wifiNetworkInfo.getDetailedState()==DetailedState.OBTAINING_IPADDR
||wifiNetworkInfo.getDetailedState()==DetailedState.CONNECTING){
returnWIFI_CONNECTING;
}elseif(wifiNetworkInfo.getDetailedState()==DetailedState.CONNECTED){
returnWIFI_CONNECTED;
}else{
Log.d(TAG,"getDetailedState()=="+wifiNetworkInfo.getDetailedState());
returnWIFI_CONNECT_FAILED;
}
}
privateWifiConfigurationIsExsits(StringSSID){
List<WifiConfiguration>existingConfigs=mWifiManager.getConfiguredNetworks();
for(WifiConfigurationexistingConfig:existingConfigs){
if(existingConfig.SSID.equals("\""+SSID+"\"")/*&&existingConfig.preSharedKey.equals("\""+password+"\"")*/){
returnexistingConfig;
}
}
returnnull;
}
//断开指定ID的网络
publicvoiddisconnectWifi(intnetId){
mWifiManager.disableNetwork(netId);
mWifiManager.disconnect();
}
//检查当前WIFI状态
publicintcheckState(){
returnmWifiManager.getWifiState();
}
//锁定WifiLock
publicvoidacquireWifiLock(){
mWifiLock.acquire();
}
//解锁WifiLock
publicvoidreleaseWifiLock(){
//判断时候锁定
if(mWifiLock.isHeld()){
mWifiLock.acquire();
}
}
//创建一个WifiLock
publicvoidcreatWifiLock(){
mWifiLock=mWifiManager.createWifiLock("Test");
}
//得到配置好的网络
publicList<WifiConfiguration>getConfiguration(){
returnmWifiConfiguration;
}
//指定配置好的网络进行连接
publicvoidconnectConfiguration(intindex){
//索引大于配置好的网络索引返回
if(index>mWifiConfiguration.size()){
return;
}
//连接配置好的指定ID的网络
mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,
true);
}
publicvoidstartScan(){
mWifiManager.startScan();
mWifiList=mWifiManager.getScanResults();
mWifiConfiguration=mWifiManager.getConfiguredNetworks();
}
//得到网络列表
publicList<ScanResult>getWifiList(){
returnmWifiList;
}
//查看扫描结果
publicStringBuilderlookUpScan(){
StringBuilderstringBuilder=newStringBuilder();
for(inti=0;i<mWifiList.size();i++){
stringBuilder
.append("Index_"+newInteger(i+1).toString()+":");
//将ScanResult信息转换成一个字符串包
//其中把包括:BSSID、SSID、capabilities、frequency、level
stringBuilder.append((mWifiList.get(i)).toString());
stringBuilder.append("/n");
}
returnstringBuilder;
}
//得到MAC地址
publicStringgetMacAddress(){
return(mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();
}
//得到接入点的BSSID
publicStringgetBSSID(){
return(mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();
}
//得到IP地址
publicintgetIPAddress(){
return(mWifiInfo==null)?0:mWifiInfo.getIpAddress();
}
//得到连接的ID
publicintgetNetworkId(){
return(mWifiInfo==null)?0:mWifiInfo.getNetworkId();
}
//得到WifiInfo的所有信息包
publicStringgetWifiInfo(){
return(mWifiInfo==null)?"NULL":mWifiInfo.toString();
}
}
WifiApAdmin.java
packagecom.widget.hotspot;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.util.Timer;
importjava.util.TimerTask;
importandroid.content.Context;
importandroid.net.wifi.WifiConfiguration;
importandroid.net.wifi.WifiManager;
importandroid.util.Log;
/**
*创建热点
*
*/
publicclassWifiApAdmin{
publicstaticfinalStringTAG="WifiApAdmin";
publicstaticvoidcloseWifiAp(Contextcontext){
WifiManagerwifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
closeWifiAp(wifiManager);
}
privateWifiManagermWifiManager=null;
privateContextmContext=null;
publicWifiApAdmin(Contextcontext){
mContext=context;
mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);
closeWifiAp(mWifiManager);
}
privateStringmSSID="";
privateStringmPasswd="";
publicvoidstartWifiAp(Stringssid,Stringpasswd){
mSSID=ssid;
mPasswd=passwd;
if(mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(false);
}
stratWifiAp();
MyTimerChecktimerCheck=newMyTimerCheck(){
@Override
publicvoiddoTimerCheckWork(){
//TODOAuto-generatedmethodstub
if(isWifiApEnabled(mWifiManager)){
Log.v(TAG,"Wifienabledsuccess!");
this.exit();
}else{
Log.v(TAG,"Wifienabledfailed!");
}
}
@Override
publicvoiddoTimeOutWork(){
//TODOAuto-generatedmethodstub
this.exit();
}
};
timerCheck.start(15,1000);
}
publicvoidstratWifiAp(){
Methodmethod1=null;
try{
method1=mWifiManager.getClass().getMethod("setWifiApEnabled",
WifiConfiguration.class,boolean.class);
WifiConfigurationnetConfig=newWifiConfiguration();
netConfig.SSID=mSSID;
netConfig.preSharedKey=mPasswd;
netConfig.allowedAuthAlgorithms
.set(WifiConfiguration.AuthAlgorithm.OPEN);
netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
netConfig.allowedKeyManagement
.set(WifiConfiguration.KeyMgmt.WPA_PSK);
netConfig.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.CCMP);
netConfig.allowedPairwiseCiphers
.set(WifiConfiguration.PairwiseCipher.TKIP);
netConfig.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.CCMP);
netConfig.allowedGroupCiphers
.set(WifiConfiguration.GroupCipher.TKIP);
method1.invoke(mWifiManager,netConfig,true);
}catch(IllegalArgumentExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IllegalAccessExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(InvocationTargetExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SecurityExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(NoSuchMethodExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
privatestaticvoidcloseWifiAp(WifiManagerwifiManager){
if(isWifiApEnabled(wifiManager)){
try{
Methodmethod=wifiManager.getClass().getMethod("getWifiApConfiguration");
method.setAccessible(true);
WifiConfigurationconfig=(WifiConfiguration)method.invoke(wifiManager);
Methodmethod2=wifiManager.getClass().getMethod("setWifiApEnabled",WifiConfiguration.class,boolean.class);
method2.invoke(wifiManager,config,false);
}catch(NoSuchMethodExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IllegalArgumentExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IllegalAccessExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(InvocationTargetExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
privatestaticbooleanisWifiApEnabled(WifiManagerwifiManager){
try{
Methodmethod=wifiManager.getClass().getMethod("isWifiApEnabled");
method.setAccessible(true);
return(Boolean)method.invoke(wifiManager);
}catch(NoSuchMethodExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
returnfalse;
}
}
MyTimeCheck.java
packagecom.widget.hotspot;
publicabstractclassMyTimerCheck{
privateintmCount=0;
privateintmTimeOutCount=1;
privateintmSleepTime=1000;//1s
privatebooleanmExitFlag=false;
privateThreadmThread=null;
/**
*DonotprocessUIworkinthis.
*/
publicabstractvoiddoTimerCheckWork();
publicabstractvoiddoTimeOutWork();
publicMyTimerCheck(){
mThread=newThread(newRunnable(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(!mExitFlag){
mCount++;
if(mCount<mTimeOutCount){
doTimerCheckWork();
try{
mThread.sleep(mSleepTime);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
exit();
}
}else{
doTimeOutWork();
}
}
}
});
}
/**
*start
*@paramtimesHowmanytimeswillcheck?
*@paramsleepTimems,Everychecksleeptime.
*/
publicvoidstart(inttimeOutCount,intsleepTime){
mTimeOutCount=timeOutCount;
mSleepTime=sleepTime;
mThread.start();
}
publicvoidexit(){
mExitFlag=true;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。