安卓——WIFI连接

来源:互联网 发布:淘宝子账号登录密码 编辑:程序博客网 时间:2024/05/21 15:48

在上一篇博客的基础上展开,
上篇博客已经完成到了,得到wifi列表以及其点击事件,接来下我们的操作就是在listView的点击事件中完成。点击即为连接,则需要输入密码,则需要弹出对话框输入密码,然后将SSID与密码进行WIFI连接操作。
1;获取SSID;
这里写图片描述
2;打开对话框以及获得密码
这里写图片描述
获取对话框搞了好久,之前是用一个类继承的,后来直接闪退,就改成了直接new对象。
3;连接;创建了一个类来进行连接

案例完整代码;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/picture3"    tools:context="com.zw.wificonnect.MainActivity" >    <Button         android:id="@+id/open"        android:onClick="open"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="打开wifi"        />    <Button         android:id="@+id/scan"        android:onClick="scan"        android:layout_alignParentRight="true"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="扫描列表"        />    <ListView          android:id="@+id/listView"          android:layout_below="@+id/open"        android:layout_width="match_parent"          android:layout_height="wrap_content" >      </ListView></RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >        <LinearLayout             android:layout_width="match_parent"            android:layout_height="wrap_content"            android:orientation="horizontal"             >            <ImageView                android:id="@+id/imageView"                android:layout_marginTop="10dp"                android:layout_width="wrap_content"                android:gravity="center"                android:layout_height="30dp"                android:src="@drawable/ic_launcher" />            <TextView                android:id="@+id/textView"                android:layout_marginTop="10dp"                android:layout_marginLeft="100dp"                android:layout_width="wrap_content"                android:gravity="center"                android:layout_height="30dp"                android:text="TextView" />        </LinearLayout></RelativeLayout>
package com.zw.wificonnect;import java.util.List;import com.zw.wificonnect.WifiConnector.WifiCipherType;import android.annotation.SuppressLint;import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.Context;import android.content.DialogInterface;import android.net.wifi.ScanResult;import android.net.wifi.WifiManager;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends ActionBarActivity {    private WifiManager wifiManager;      private List<ScanResult> list;    private ListView listView;    private ScanResult result;    WifiConnector wac;    String ssid = null;    String psw = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);        wac = new WifiConnector(wifiManager);    }    public void open(View v){        openWifi();    }    public void scan(View v){        init();     }    /**     * 获取wifi管理者来获取附近wifi链表。     */    private void init() {          list = wifiManager.getScanResults();          listView = (ListView) findViewById(R.id.listView);          if (list == null) {              Toast.makeText(this, "wifi未打开!", Toast.LENGTH_LONG).show();          }else {              MyAdapter myAdapter = new MyAdapter(this,list);            listView.setAdapter(myAdapter);              listView.setOnItemClickListener(new OnItemClickListener(){                @SuppressLint("NewApi")                @Override                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                    ScanResult scanResult = list.get(position);                    ssid = scanResult.SSID;                    final EditText et = new EditText(MainActivity.this);                    new AlertDialog.Builder(MainActivity.this)                        .setTitle("请输入密码")                        .setView(et)                        .setPositiveButton("确定",new DialogInterface.OnClickListener() {                            @Override                            public void onClick(DialogInterface dialog,int which) {                                psw = et.getText().toString();                                wac.connect(ssid, psw,psw.equals("") ?WifiCipherType.WIFICIPHER_NOPASS:WifiCipherType.WIFICIPHER_WPA);                                //Toast.makeText(getApplicationContext(),et.getText(),Toast.LENGTH_SHORT).show();                            }                            })                        .setNegativeButton("取消", null)                        .setCancelable(false).show();                    }            });         }    }    /**      *  打开WIFI      */      private void openWifi() {         if (!wifiManager.isWifiEnabled()) {          wifiManager.setWifiEnabled(true);         }      } }
package com.zw.wificonnect;import java.util.List;import android.content.Context;import android.net.wifi.ScanResult;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;public class MyAdapter extends BaseAdapter{    LayoutInflater inflater;    List<ScanResult> list;    public MyAdapter(Context context, List<ScanResult> list) {        // TODO Auto-generated constructor stub        this.inflater = LayoutInflater.from(context);        this.list = list;    }    @Override    public int getCount() {        // TODO Auto-generated method stub        return list.size();    }    @Override    public Object getItem(int position) {        // TODO Auto-generated method stub        return position;    }    @Override    public long getItemId(int position) {        // TODO Auto-generated method stub        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {         // TODO Auto-generated method stub        View view = null;        view = inflater.inflate(R.layout.item_wifi_list, null);        //设置item的样式图片;        view.setBackgroundResource(R.drawable.msgbox_rec);        ScanResult scanResult = list.get(position);        TextView textView = (TextView) view.findViewById(R.id.textView);        textView.setText(scanResult.SSID);        ImageView imageView = (ImageView) view.findViewById(R.id.imageView);        //判断信号强度,显示对应的指示图标        if (Math.abs(scanResult.level) > 100) {            imageView.setImageResource(R.drawable.wifi_1);        } else if (Math.abs(scanResult.level) > 80) {            imageView.setImageResource(R.drawable.wifi_2);        } else if (Math.abs(scanResult.level) > 70) {            imageView.setImageResource(R.drawable.wifi_2);        } else if (Math.abs(scanResult.level) > 60) {            imageView.setImageResource(R.drawable.wifi_3);        } else if (Math.abs(scanResult.level) > 50) {            imageView.setImageResource(R.drawable.wifi_3);        } else {            imageView.setImageResource(R.drawable.wifi_4);        }        return view;    }}
package com.zw.wificonnect;import java.util.List;import android.net.wifi.WifiConfiguration;import android.net.wifi.WifiManager;import android.net.wifi.WifiConfiguration.AuthAlgorithm;import android.net.wifi.WifiConfiguration.KeyMgmt;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.util.Log;public class WifiConnector {    public Handler mHandler;    WifiManager wifiManager;    /**     * 向UI发送消息     * @param info 消息     */    public void sendMsg(String info) {        if (mHandler != null) {            Message msg = new Message();            msg.obj = info;            mHandler.sendMessage(msg);// 向Handler发送消息        } else {            Log.e("wifi", info);        }    }    //WIFICIPHER_WEP是WEP ,WIFICIPHER_WPA是WPA,WIFICIPHER_NOPASS没有密码    public enum WifiCipherType {        WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID    }    // 构造函数    public WifiConnector(WifiManager wifiManager) {        this.wifiManager = wifiManager;    }    // 提供一个外部接口,传入要连接的无线网    public void connect(String ssid, String password, WifiCipherType type) {        Thread thread = new Thread(new ConnectRunnable(ssid, password, type));        thread.start();    }    // 查看以前是否也配置过这个网络    private WifiConfiguration isExsits(String SSID) {        List<WifiConfiguration> existingConfigs = wifiManager                .getConfiguredNetworks();        for (WifiConfiguration existingConfig : existingConfigs) {            if (existingConfig.SSID.equals("\"" + SSID + "\"")) {                return existingConfig;            }        }        return null;    }    private WifiConfiguration createWifiInfo(String SSID, String Password,            WifiCipherType Type) {        WifiConfiguration config = new WifiConfiguration();        config.allowedAuthAlgorithms.clear();        config.allowedGroupCiphers.clear();        config.allowedKeyManagement.clear();        config.allowedPairwiseCiphers.clear();        config.allowedProtocols.clear();        config.SSID = "\"" + SSID + "\"";        // nopass        if (Type == WifiCipherType.WIFICIPHER_NOPASS) {            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);        }        // wep        if (Type == WifiCipherType.WIFICIPHER_WEP) {            if (!TextUtils.isEmpty(Password)) {                if (isHexWepKey(Password)) {                    config.wepKeys[0] = Password;                } else {                    config.wepKeys[0] = "\"" + Password + "\"";                }            }            config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);            config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);            config.allowedKeyManagement.set(KeyMgmt.NONE);            config.wepTxKeyIndex = 0;        }        // wpa        if (Type == WifiCipherType.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;        }        return config;    }    // 打开wifi功能    private boolean openWifi() {        boolean bRet = true;        if (!wifiManager.isWifiEnabled()) {            bRet = wifiManager.setWifiEnabled(true);        }        return bRet;    }    class ConnectRunnable implements Runnable {        private String ssid;        private String password;        private WifiCipherType type;        public ConnectRunnable(String ssid, String password, WifiCipherType type) {            this.ssid = ssid;            this.password = password;            this.type = type;        }        @Override        public void run() {            try {                // 打开wifi                openWifi();                sendMsg("opened");                Thread.sleep(200);                // 开启wifi功能需要一段时间(我在手机上测试一般需要1-3秒左右),所以要等到wifi                // 状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句                while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {                    try {                        // 为了避免程序一直while循环,让它睡个100毫秒检测……                        Thread.sleep(100);                    } catch (InterruptedException ie) {                    }                }                WifiConfiguration wifiConfig = createWifiInfo(ssid, password,                        type);                //                if (wifiConfig == null) {                    sendMsg("wifiConfig is null!");                    return;                }                WifiConfiguration tempConfig = isExsits(ssid);                if (tempConfig != null) {                    wifiManager.removeNetwork(tempConfig.networkId);                }                int netID = wifiManager.addNetwork(wifiConfig);                boolean enabled = wifiManager.enableNetwork(netID, true);                sendMsg("enableNetwork status enable=" + enabled);                boolean connected = wifiManager.reconnect();                sendMsg("enableNetwork connected=" + connected);                sendMsg("连接成功!");            } catch (Exception e) {                // TODO: handle exception                sendMsg(e.getMessage());                e.printStackTrace();            }        }    }    private static boolean isHexWepKey(String wepKey) {        final int len = wepKey.length();        // WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?)        if (len != 10 && len != 26 && len != 58) {            return false;        }        return isHex(wepKey);    }    private static boolean isHex(String key) {        for (int i = key.length() - 1; i >= 0; i--) {            final char c = key.charAt(i);            if (!(c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a'                    && c <= 'f')) {                return false;            }        }        return true;    }}