且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

通过Android应用程序连接到WiFi

更新时间:2022-03-19 22:54:07

您需要一个ScanResult确定由用户选择了无线网络配置的加密类型。

You need a ScanResult to determine the encryption type of the wifi configuration picked by the user.

在code以下工作正常,在我的应用程序,但不处理尚EAP加密类型。

The code below works fine in my app, except the EAP encryption type is not handled yet.

还有一件事,方法mWifiManager.reassociate()和mWifiManager.reconnect()似乎为我工作一样。

And one more thing, the method mWifiManager.reassociate( ) and mWifiManager.reconnect( ) seems work the same for me.

 private void connectWifi( ScanResult sr , String pwd )
    {

    WifiConfiguration config = new WifiConfiguration( );
    config.allowedAuthAlgorithms.clear( );
    config.allowedGroupCiphers.clear( );
    config.allowedKeyManagement.clear( );
    config.allowedPairwiseCiphers.clear( );
    config.allowedProtocols.clear( );
    config.SSID = "\"" + sr.SSID + "\"";

    if( sr.capabilities.contains( "WEP" ) )
    {
        config.hiddenSSID = true;

        if( pwd.matches( "[0-9A-Fa-f]{64}" ) )
        {
        config.preSharedKey = pwd;
        }
        else
        {
        config.preSharedKey = '"' + pwd + '"';
        }

        config.allowedKeyManagement.set( KeyMgmt.NONE );
        config.allowedAuthAlgorithms.set( WifiConfiguration.AuthAlgorithm.OPEN );
        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.wepTxKeyIndex = 0;

    }
    else if( sr.capabilities.contains( "PSK" ) )
    {
        config.preSharedKey = "\"" + pwd + "\"";
        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.allowedGroupCiphers.set( WifiConfiguration.GroupCipher.CCMP );
        config.allowedPairwiseCiphers.set( WifiConfiguration.PairwiseCipher.CCMP );
        config.status = WifiConfiguration.Status.ENABLED;
    }
    else if( sr.capabilities.contains( "EAP" ) )
    {

    }
    else
    {
        config.allowedKeyManagement.set( KeyMgmt.NONE );
    }

    int wcgID = mWifiManager.addNetwork( config );
    mWifiManager.enableNetwork( wcgID , true );
    //  mWifiManager.reconnect( );
    mWifiManager.reassociate( );
    mWifiManager.saveConfiguration( );
    }






private final OnItemClickListener mOnItemClickListener = new OnItemClickListener( )
    {

    @Override
    public void onItemClick( AdapterView< ? > parent , View view , int position , long id )
    {
        final ScanResult sr = sortWifiList.get( position );
        if( !mWifiInfo.getSSID( ).equals( "\"" + sr.SSID + "\"" ) )
        {
        mConnectState = NO_CONNECT;
        refreshConnectViews( );
        }
        connectImage = (ImageView)view.findViewById( R.id.wifi_connected );
        connectTextView = (TextView)view.findViewById( R.id.wifi_info_state );
        connectTextView.setTag( sr );
        //      connectTextView.setVisibility( View.VISIBLE );
        //      connectImage.setVisibility( View.VISIBLE );
        //      connectTextView.setText( R.string.wifi_connecting );
        //      connectImage.setBackground( refreshDrawable );
        //      connectImage.startAnimation( animation );
        //      TextView wifiSsid = (TextView)view.findViewById( R.id.wifi_ssid );
        //      wifiSsid.setPadding( 0 , 0 , 0 , 0 );
        if( !mWifiInfo.getSSID( ).equals( "\"" + sr.SSID + "\"" ) )
        {
        if( hasLocked( sr.capabilities ) )
        {
            mWifiConfiguration = mWifiManager.getConfiguredNetworks( );
            WifiConfiguration wc = hasSaved( sr );
            // saved wifi , connect directly
            if( wc != null )
            {
            connectWifi( wc );
            }
            else
            {
            enterPasswordDialog( view , sr );
            }
        }
        else
        {
            connectWifi( sr , "" );
        }
        }
        autoRefresh = false;
        mScanner.pause( );
    }
    };


    private boolean hasLocked( String capabilities )
    {
    if( capabilities.contains( "WEP" ) )
    {
        return true;
    }
    else if( capabilities.contains( "PSK" ) )
    {
        return true;
    }
    else if( capabilities.contains( "EAP" ) )
    {
        return true;
    }
    return false;
    }

private void connectWifi( WifiConfiguration wc )
{
    int wcgID = mWifiManager.addNetwork( wc );
    mWifiManager.enableNetwork( wcgID , true );
    //  mWifiManager.reconnect( );
    mWifiManager.reassociate( );
}