Android開発実践:WIFIスキャン機能のパッケージ


ネット上でAndroid WIFIモジュールの開発に関するブログはすでに多く、ここでも私がWIFIモジュールのプログラミングに対するいくつかの消化結果を提供したいと思っています.AndroidのいくつかのAPIをクラス化し、各Androidアプリで多重化しやすく、プログラムの開発を簡素化します.
ここではまず、スキャンWIFI機能をクラスにカプセル化し、そのクラスオブジェクトを作成した後、search()関数を簡単に呼び出すと、バックグラウンドで現在のWIFI SSIDが自動的にスキャンされ、スキャン結果がコールバック形式で通知されます.コードは以下の通りで、注意すべき点はコメントで表記されています.
package com.example.testwifi;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
                                  
public class WifiSearcher {
                                                                                                                                                                                             
    private static final int WIFI_SEARCH_TIMEOUT = 20; //  WIFI     
                                                                                                                                                                                             
    private Context mContext;
    private WifiManager mWifiManager;   
    private WiFiScanReceiver mWifiReceiver;      
    private Lock mLock;
    private Condition mCondition;
    private SearchWifiListener mSearchWifiListener;
    private boolean mIsWifiScanCompleted = false;
                                                                                                                                                                                             
    public static enum ErrorType {
        SEARCH_WIFI_TIMEOUT, //  WIFI  (       )
        NO_WIFI_FOUND,       //  WIFI  ,      WIFI  
    }
                                                                                                                                                                                             
    //            Caller
    public interface SearchWifiListener {
        public void onSearchWifiFailed(ErrorType errorType);
        public void onSearchWifiSuccess(List<String> results);
    }
                                                                                                                                                                                             
    public WifiSearcher( Context context, SearchWifiListener listener ) {
                                                                                                                                                                                                 
        mContext = context;
        mSearchWifiListener = listener;
                                                                                                                                                                                                 
        mLock = new ReentrantLock();
        mCondition = mLock.newCondition();
        mWifiManager=(WifiManager)mContext.getSystemService(Context.WIFI_SERVICE);     
                                                                                                                                                                                                 
        mWifiReceiver = new WiFiScanReceiver();     
    }
                                                                                                                                                                                   
    public void search() {
                                                                                                                                                                                                 
        new Thread(new Runnable() {
                                                                                                                                                                                                     
            @Override
            public void run() {
                //  WIFI    ,   WIFI
                if( !mWifiManager.isWifiEnabled() ) {
                    mWifiManager.setWifiEnabled(true);
                }
                                                                                                                                                                                                                 
                //    WIFI          
                mContext.registerReceiver(mWifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
                                                                                                                                                                                                         
                //    
                mWifiManager.startScan();
                                                                                                                                                                                                                        
                mLock.lock();
                                                                                                                                                                                                         
                //        
                try {                
                    mIsWifiScanCompleted = false;                
                    mCondition.await(WIFI_SEARCH_TIMEOUT, TimeUnit.SECONDS);
                    if( !mIsWifiScanCompleted ) {
                        mSearchWifiListener.onSearchWifiFailed(ErrorType.SEARCH_WIFI_TIMEOUT);
                    }
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                                                                                                                                                                                                         
                mLock.unlock();
                                                                                                                                                                                                         
                //          
                mContext.unregisterReceiver(mWifiReceiver);                          
            }
        }).start();  
    }
                                                                                                                                                                                     
    //  WIFI                
    protected class WiFiScanReceiver extends BroadcastReceiver {
                                                                                                                                                                                                 
        public void onReceive(Context c, Intent intent) {
                                                                                                                                                                                             
            //      
            List<String> ssidResults = new ArrayList<String>();
            List<ScanResult> scanResults = mWifiManager.getScanResults();              
            for(ScanResult result : scanResults ) {
                ssidResults.add(result.SSID);    
            }
                                                                                                                                                                                                     
            //      
            if( ssidResults.isEmpty() ) {
                mSearchWifiListener.onSearchWifiFailed(ErrorType.NO_WIFI_FOUND);
            }
            else {
                mSearchWifiListener.onSearchWifiSuccess(ssidResults);
            }
                                                                                                                                                                                                     
            mLock.lock();
            mIsWifiScanCompleted = true;
            mCondition.signalAll();  
            mLock.unlock();
        }
    }
}

コードにはLockとConditionが用いられており、WIFIスキャンの結果をブロックして待つため、従来はsearch関数内部でリスニング対象のregisterReceiverとunregisterReceiverを直接完了することができ、何らかの理由でunregisterReceiverを忘れてプログラムcrashを発生させることを防止する一方で、一部のAndroidシステムでは、WIFIスキャン結果をタイムリーに受信できるとは限らず、タイムアウト時間を設定することで、UIがWIFIスキャン結果を長時間待つことなく「偽死」することがあります.
そうだAndroidManifestxmlファイルに権限サポートを追加することを忘れないでください.
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>      
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

このWIFIスキャンクラスはここまで共有して、初心者に役に立つことを望んで、javaファイルは博文の後ろの添付ファイルを見て、何か疑問があれば伝言や手紙を歓迎します[email protected]交流したり、私の新浪微博@ルー_に注目したりします.俊は最新の文章と情報を取得した.