從Android framework層實(shí)現(xiàn)實(shí)現(xiàn)wifi無(wú)縫切換

Android市場(chǎng)上有一款叫Wifijumper的軟件,實(shí)現(xiàn)相同ssid的多個(gè)AP之間根據(jù)wifi信號(hào)的強(qiáng)弱與閥值進(jìn)行判斷,實(shí)現(xiàn)自動(dòng)切換AP的功能。目前在android4.2之前系統(tǒng)都沒(méi)有該功能,對(duì)于google來(lái)講,這是個(gè)相當(dāng)簡(jiǎn)單的問(wèn)題,不明白為什么一直都不支持該功能。鄙人之前在某個(gè)方案公司就遇到過(guò)客戶需要該功能。以下是鄙人實(shí)現(xiàn)的具體過(guò)程,希望對(duì)大家有些許的幫助。
首先我們必須時(shí)刻監(jiān)聽(tīng)當(dāng)前wifi的信號(hào)強(qiáng)度,那么我們的手機(jī)連上wifi之后狀態(tài)蘭就會(huì)有wifi圖標(biāo)出來(lái),并且信號(hào)強(qiáng)度變化信號(hào)格也要跟隨變化,這部分工作是在SystemUI完成的。在目錄
framework/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
這個(gè)類就是SystemUI監(jiān)聽(tīng)網(wǎng)絡(luò)連接狀態(tài)的Receiver。
在OnReceive方法中

if ( action.equals( WifiManager.RSSI_CHANGED_ACTION )
     || action.equals( WifiManager.WIFI_STATE_CHANGED_ACTION )
     || action.equals( WifiManager.NETWORK_STATE_CHANGED_ACTION ) )
{
    updateWifiState( intent );
    refreshViews();
}

調(diào)用了 updateWifiState(Intent intent)方法,那么我們的切換功能就可以放到這個(gè)updateWifiState方法中:

mWifiRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
            mWifiLevel = WifiManager.calculateSignalLevel(
                    mWifiRssi, WifiIcons.WIFI_LEVEL_COUNT);

添加一下代碼:

+import android.net.wifi.ScanResult; /* 導(dǎo)入包 */
boolean isWorking = false;
if ( mWifiConnected )
{
    WifiInfo wifiInfo = ( (WifiManager) mContext.getSystemService( Context.WIFI_SERVICE ) ).getConnectionInfo();

    /* ---- */
    if ( (wifiInfo != null) && !isWorking )
    {
        String  curentSSID  = wifiInfo.getSSID();
        String  currentBssid    = wifiInfo.getBSSID();
        Log.e( TAG,
               "updateWifiState curentSSID == " + curentSSID +
               " currentBssid = " + currentBssid + " mWifiRssi = " +
               mWifiRssi + " mWifiLevel = " + mWifiLevel );

        List<ScanResult>    sameSSIDList    = new ArrayList<ScanResult>();
        List<ScanResult>    list        = mWifiManager.getScanResults();

        if ( list != null )
        {
            for ( ScanResult rt : list )
            {
                Log.e( TAG,
                       "list  ----------  onReceive():ScanResult = " +
                       rt );

                if ( curentSSID.equals( rt.SSID ) )
                {
                    sameSSIDList.add( rt );
                }
            }
        }

        if ( sameSSIDList.size() >= 2 )
        {
            ScanResult strongestRssi = sameSSIDList.get( 0 );

            for ( int i = 1; i <= (sameSSIDList.size() - 1); i++ )
            {
                if ( sameSSIDList.get( i ).level > strongestRssi.level )
                {
                    strongestRssi = sameSSIDList.get( i );
                }
            }

            /*
             * int strongestLevel = WifiManager.calculateSignalLevel(
             *  strongestRssi.level, WifiIcons.WIFI_LEVEL_COUNT);
             */
            Log.e( TAG,
                   "strongestRssi = " + strongestRssi +
                   " mWifiRssi = " + mWifiRssi );

            /* if(!currentBssid.equals(strongestRssi.BSSID) && (strongestLevel - mWifiLevel) >= 1){ */
            if ( (strongestRssi.level - mWifiRssi) >= 18 )
            {
                Log.e( TAG, "do reconnect now !!!!!!!!!!!!" );
                /*
                 * count++;
                 * if(count > 1){
                 */
                mWifiManager.disconnect();
                mWifiManager.reconnect();
                isWorking = true;

                /*
                 * count = 0;
                 * }
                 */
            }

            /*
             * else{
             *    count = 0;
             * }
             */
        }
    }

    /* ---- */
}
  

邏輯其實(shí)很簡(jiǎn)單,就是根據(jù)當(dāng)前ssid去掃描的列表中找相同ssid的ap如果有,就找信號(hào)最強(qiáng)的,當(dāng)最強(qiáng)的那個(gè)信號(hào)比當(dāng)前的信號(hào)超過(guò)一定的值時(shí),斷開(kāi)重連。當(dāng)然這種做法還是效率不是高的。原因就是當(dāng)你在不停的移動(dòng)中,傳過(guò)來(lái)的信號(hào)值其實(shí)和當(dāng)前的實(shí)際值有一定的差異。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容