android 指定wifi熱點自動連接


 

   這兩天幫別人做個小玩意,要求由android客戶端往指定的wifi路由器上發送指令來控制單片機末端的設備,本來想着在進入客戶端后自動連接到指定熱點,

這樣自動化的用戶體驗會好些,結果寫好了以后人家說不用,就讓用戶手動連接吧,應為是小活也不是很在意,不過把這段代碼共享下吧或者自己以后用的話也方便。

 

Activity內容如下:

  1 package com.shineEye.www;
  2 
  3 import java.util.List;
  4 
  5 import android.Manifest.permission;
  6 import android.app.Activity;
  7 import android.app.Service;
  8 import android.content.BroadcastReceiver;
  9 import android.content.Context;
 10 import android.content.Intent;
 11 import android.content.IntentFilter;
 12 import android.net.wifi.ScanResult;
 13 import android.net.wifi.WifiConfiguration;
 14 import android.net.wifi.WifiInfo;
 15 import android.net.wifi.WifiManager;
 16 import android.os.Bundle;
 17 import android.os.Handler;
 18 import android.os.Message;
 19 import android.util.Log;
 20 import android.view.View;
 21 import android.view.View.OnClickListener;
 22 import android.widget.Button;
 23 import android.widget.Toast;
 24 
 25 /**
 26  * @Class Name : WifiAutoConnection.java
 27  * @Description  WIFI自動連接測試類 
 28  * @Author YuanLiangFeng 袁良鋒 lufengdie@126.com
 29  * @Date 2013-4-18 - 上午12:09:44
 30  */
 31 public class WifiAutoConnection extends Activity implements OnClickListener{
 32 
 33     
 34     private final String TAG = getClass().getSimpleName();
 35     /** 指定熱點SSID **/
 36     private final String wifiSSID = "\"TP-LINK_585034\"";
 37     /** 指定熱點名稱 **/
 38     private final String wifiName = "TP-LINK_585034";
 39     /** WIFI管理器 **/
 40     private WifiManager wifiManager = null;
 41     /** WIFI狀態監聽廣播 **/
 42     private BroadcastReceiver receiver;
 43     /** 指定熱點網絡ID **/
 44     private int networkId;
 45 
 46     /** 指定熱點是否已連接  **/
 47     private boolean targetWifiEnable = false;
 48     
 49     /** 打開按鈕 **/
 50     private Button openLight;
 51     /** 關閉按鈕 **/
 52     private Button closeLight;
 53     
 54     
 55     @Override
 56     protected void onCreate(Bundle savedInstanceState) {
 57         super.onCreate(savedInstanceState);
 58         setContentView(R.layout.main);
 59         initUI();
 60     }
 61     
 62     private void initUI(){
 63         openLight = (Button) findViewById(R.id.openLight);
 64         closeLight = (Button) findViewById(R.id.closeLight);
 65         openLight.setOnClickListener(this);
 66         closeLight.setOnClickListener(this);
 67     }
 68     
 69     
 70     @Override
 71     protected void onResume() {
 72         super.onResume();
 73         initWifiConnection();
 74     }
 75     
 76     private void initWifiConnection(){
 77         wifiManager = (WifiManager) getSystemService(Service.WIFI_SERVICE);
 78         WifiInfo wifiInfo = wifiManager.getConnectionInfo();
 79         if (wifiSSID.equals(wifiInfo.getSSID()) ) {
 80             targetWifiEnable = true;
 81             return;
 82         }
 83         
 84         if (targetWifiIsConfig()) {
 85             if (!wifiManager.isWifiEnabled()) {
 86                 if (wifiManager.setWifiEnabled(true)) {
 87                     registerWifiChangeBoradCast();
 88                 }else{
 89                     showLongToast("wifi開啟失敗,請手動打開!");
 90                     Log.d(TAG, "WIFI開啟失敗");
 91                 }
 92             }else{
 93                 if (targetWifiCanScan()) {
 94                     connectionTargetWifi();
 95                 }
 96             }
 97         }
 98     }
 99     
100     /**
101      * Description 指定WIFI是否可以被掃描到,即是否在可用范圍內
102      * @return true表示可用,否則不可用
103      */
104     private boolean targetWifiCanScan(){
105         List<ScanResult> scanResultList = wifiManager.getScanResults();
106         if (scanResultList != null && scanResultList.size() > 0) {
107             for (int i = 0; i < scanResultList.size(); i++) {
108                 ScanResult scanResult = scanResultList.get(i);
109                 
110             StringBuffer str = new StringBuffer()
111                                .append("SSID: " + scanResult.SSID).append("\n")
112                                .append("BSSID: " + scanResult.BSSID).append("\n")
113                                .append("capabilities: " + scanResult.capabilities).append("\n")
114                                .append("level: " + scanResult.level).append("\n")
115                                .append("frequency: " + scanResult.frequency);
116             Log.i(TAG, str.toString());
117                 
118                 if (scanResult.SSID.equals(wifiName)) {
119                     return true;
120                 }
121             }
122         }
123         showLongToast("指定wifi熱點暫不可用,稍后可能無法操作照明設備!");
124         return false;
125     }
126     
127     /**
128      * Description 指定熱點是否已配置(注冊) 
129      * @return true表示已注冊,否則未注冊
130      */
131     private boolean targetWifiIsConfig(){
132         List<WifiConfiguration> wifiConfigurationList = wifiManager.getConfiguredNetworks();
133         for (int i = 0; i < wifiConfigurationList.size(); i++) {
134             WifiConfiguration wifiConfiguration = wifiConfigurationList.get(i);
135             
136 //            StringBuffer str = new StringBuffer()
137 //                    .append("SSID: " + wifiConfiguration.SSID).append("\n")
138 //                    .append("status: " + wifiConfiguration.status).append("\n")
139 //                    .append("networkId: " + wifiConfiguration.networkId).append("\n")
140 //                    .append("priority: " + wifiConfiguration.priority).append("\n")
141 //                    .append("wepTxKeyIndex: " + wifiConfiguration.wepTxKeyIndex);
142 //            Log.i(TAG, str);
143             
144             if (wifiConfiguration.SSID.equals(wifiSSID)) {
145                 networkId = wifiConfiguration.networkId;
146                 return true;
147             }
148         }
149         showLongToast("指定wifi熱點未注冊,請在wifi管理中先注冊!");
150         return false;
151     }
152     
153     /**
154      * Description 連接指定熱點 
155      * @return
156      */
157     private boolean connectionTargetWifi(){
158         if (wifiManager.enableNetwork(networkId, true)) {
159             targetWifiEnable = true;
160             Log.i(TAG, "熱點連接成功");
161             return true;
162         }else{
163             showLongToast("指定wifi熱點連接失敗,請手動連接!");
164             Log.d(TAG, "熱點連接失敗");
165             return false;
166         }
167     }
168     
169     /**
170      * Description 注冊WIFI狀態改變監聽廣播
171      */
172     private void registerWifiChangeBoradCast(){
173         receiver = new BroadcastReceiver() {
174             
175             @Override
176             public void onReceive(Context context, Intent intent) {
177                 // WIFI可用時連接到指定熱點
178                 System.out.println(wifiManager.getWifiState());
179                 if (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
180                     Log.i(TAG, "WIFI成功開啟");
181                     unregisterWifiChangeReceiver();
182                     handler.sendEmptyMessageDelayed(0, 10 * 1000);
183                 }
184             }
185         };
186         
187         IntentFilter filter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
188         String broadcastPermission = permission.ACCESS_WIFI_STATE;
189         registerReceiver(receiver, filter, broadcastPermission, new Handler(){
190             @Override
191             public void handleMessage(Message msg) {
192                 super.handleMessage(msg);
193             }
194         });
195     }
196 
197     /**
198      * Description 注銷WIFI狀態改變監聽廣播 
199      */
200     private void unregisterWifiChangeReceiver(){
201         if (receiver != null) {
202             unregisterReceiver(receiver);
203         }
204     }
205     
206     /**
207      * Description  顯示短時長顯示的Toast 
208      * @param text
209      */
210     @SuppressWarnings("unused")
211     private void showShortToast(String text){
212         Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
213     }
214     
215     /**
216      * Description  顯示久時長顯示的Toast 
217      * @param text
218      */
219     private void showLongToast(String text){
220         if (text != null && !"".equals(text)) {
221             Toast.makeText(this, text, Toast.LENGTH_LONG).show();
222         }
223     }
224 
225     @Override
226     public void onClick(View v) {
227         switch (v.getId()) {
228         
229         case R.id.openLight:
230             if (targetWifiEnable) {
231                 showLongToast(HttpHelper.sendCommandToServer("A1"));
232             }else{
233                 initWifiConnection();
234             }
235             break;
236             
237         case R.id.closeLight:
238             if (targetWifiEnable) {
239                 showLongToast(HttpHelper.sendCommandToServer("B1"));
240             }else{
241                 initWifiConnection();
242             }
243             break;
244 
245         default:
246             break;
247         }
248     }
249     
250     private Handler handler = new Handler(){
251         public void handleMessage(Message msg) {
252             if (targetWifiCanScan()) {
253                 connectionTargetWifi();
254             }
255         }
256     };
257     
258 }

 

布局文件:

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:orientation="vertical"
 6     android:gravity="center_horizontal"
 7     android:padding="20dp">
 8     
 9     <TextView android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:text="下面兩個按鈕可以控制序號為1的設備,指令分別為A1和B1.">
12     </TextView>    
13     
14     <Button android:id="@+id/openLight"
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:layout_marginTop="50dp"
18         android:text="打開設備">
19     </Button>
20     
21     <Button android:id="@+id/closeLight"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:layout_marginTop="20dp"
25         android:text="關閉設備">
26     </Button>    
27 
28 </LinearLayout>

 

mainfest配置文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.shineEye.www"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6 
 7     <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7"/>
 8     
 9     
10     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
11     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
12     <uses-permission android:name="android.permission.INTERNET"/>
13 
14     
15     <application
16         android:icon="@drawable/ic_launcher"
17         android:label="@string/app_name"
18         android:description="@string/appDescription">
19         
20         <activity
21             android:name=".WifiAutoConnection"
22             android:label="@string/app_name"
23             android:theme="@android:style/Theme.Light.NoTitleBar" >
24             <intent-filter>
25                 <action android:name="android.intent.action.MAIN" />
26                 <category android:name="android.intent.category.LAUNCHER" />
27             </intent-filter>
28         </activity>
29         
30         
31     </application>
32 
33 </manifest>

 

csdn資源下載地址審核過后即貼上!

 下載地址: http://download.csdn.net/detail/lufengdie/5285211

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM