Android WiFi功能实现,知其然必知其所以然! (二)
来源:互联网 发布:pdf转图片软件 编辑:程序博客网 时间:2024/04/29 11:49
终于吧WiFi功能搞定了,前后历时半个多月的时间。进度有些慢。但还是很充实的,搞定一个自己面临的难题时,那种豁然开朗的感觉,让人神清气爽。要不是在公司上班时间,真想大吼一声!“咱老百姓啊,今儿个真高兴。。”
我想爱哥,鸿洋和老郭在此的话,肯定嗤之以鼻,心里碎碎念:老子搞个妞都没这么麻烦。。哈哈。
讲一讲昨晚的趣事,话说昨晚同窗好友邀我LOL战斗个三百回合,我本想拒绝,因为我是爱学习的孩子。后来想一想,劳逸结合才是上上策。于是欣然赴约。进游戏所有人都秒选,奈何我新号没啥英雄,所以看到免费英雄里有我的最爱--阿卡利(我的成名英雄)。只好用她打野。第一局顺风顺水,成功走上超神之路。可惜第二局我还是被迫选得阿卡利打野,然而竟让我伙的狗熊质疑我。真是是可忍孰不可忍,叔叔可以忍我不能忍。于是我小宇宙爆发,成功拿下红蓝Buff,以及对方打野两次人头后。狗熊感觉他的世界观崩溃了。开始疯狂的送人头,送谁不好偏偏送对方卡特。于是乎,我们的末日来临了。我方内部开始君子行动,君子动口不动手的原则,不断的慰问狗熊。我明知的分析,光慰问是赢不了的。所以在我采取敌进我退,敌退我偷的战略后。距离成神仅一步之遥,然后惜败。整整30多分钟,狗熊送了40多人头。也苦了这孩子了。。。待我收拾妥当准备休息时,隔壁大吼一声:该出手时就出手啊!!然后就是掀桌子扔板凳紧接着就是噼噼啪啪伴随着惨叫声不绝于耳我的第一反应是完了狗熊被人肉了!!(所谓:句读之不知,惑之不解。我就想看看有多少人看懂了这句话。哈哈)于是幸灾乐祸的熄灯睡觉。
闲言少叙,言归正传,咱们代码说事。
在上一篇文章Android WiFi功能实现,知其然必知其所以然!(一)中,我封装了几个WiFi常见处理的方法,详情请跳转。但,这里也要声明一些问题。对于上一篇文章,WiFi的创建,配置,搜索,关闭等方法都没有错。但一直没有成功的链接到指定的WiFi或WiFi热点上。是上一篇悬而未解的疑案。经过我新的一周的不懈努力,终于发现问题所在,最终的问题是出在对WiFi链接的理解上。这里给大家带来的不便,尽请谅解。现在重新解释一下,WiFi热点,其实也是WiFi。不要把热点和WiFi区分开,他们的区别在直观上给我们的印象是,WiFi--比如路由器的无线网络,热点--比如手机发射的无线信号。其实他们是没有区别的。都是WiFi热点。只不过信号源有区别罢了。
理解到这里,那自然一切都明白了,创建手机WiFi热点,用的是系统提供的创建热点的API,而热点也是WiFi,在链接热点时,其实也就是链接WiFi,那么,用平时的WiFi链接方法,就一切OK了。(在这之前,由于没有认真分析这之前的关系,一直以为WiFi是WiFi,热点是热点,然后就出现了,在用链接热点的方法链接热点时,方法返回链接成功的状态,而却一直无法链接,这着实让我纠结好一阵子。)
接下来,看看代码实现。
WifiHotspotUtils.java------WiFi热点工具类
package com.lizhipeng.wifiHotPoint.activity.utils;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Iterator;import java.util.List;import com.lizhipeng.wifiHotPoint.activity.MainActivity;import android.net.wifi.ScanResult;import android.net.wifi.WifiConfiguration;import android.net.wifi.WifiManager;import android.util.Log;/** * WiFi热点工具类 * * @author lizhipeng * */public class WifiHotspotUtils {public static final String TAG = "WifiHotPointUtils";public static WifiConfiguration createWifiInfo2(String ssid,String password, int paramInt) {WifiConfiguration config = new WifiConfiguration();config.allowedAuthAlgorithms.clear();config.allowedGroupCiphers.clear();config.allowedKeyManagement.clear();config.allowedPairwiseCiphers.clear();config.allowedProtocols.clear();config.SSID = ssid;if (paramInt == 1) // WIFICIPHER_NOPASS 不加密{config.wepKeys[0] = "";config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;return config;}if (paramInt == 2) // WIFICIPHER_WEP WEP加密{config.hiddenSSID = true;config.wepKeys[0] = password;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.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);config.wepTxKeyIndex = 0;return config;}if (paramInt == 3) // WIFICIPHER_WPA 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;}return null;// 返回null,创建热点失败}/** * 创建WiFi热点 * @param wifiManager WiFi管理器 * @param config WiFi配置信息 * @param paramBoolean true为开启WiFi热点,false为关闭 * @return 返回开启成功状态,true为成功,false为失败 */public static boolean createWiFiAP(WifiManager wifiManager,WifiConfiguration config, boolean paramBoolean) {// 开启热点前,如果WiFi可用,先关闭WiFi if (wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(false); } Log.i(TAG, "into startWifiAp() 启动一个Wifi 热点!"); boolean ret = false; try { Method method = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); ret = (Boolean) method.invoke(wifiManager, config, paramBoolean); } catch (IllegalArgumentException e) { e.printStackTrace(); Log.d(TAG, "stratWifiAp() IllegalArgumentException e"); } catch (IllegalAccessException e) { e.printStackTrace(); Log.d(TAG, "stratWifiAp() IllegalAccessException e"); } catch (InvocationTargetException e) { e.printStackTrace(); Log.d(TAG, "stratWifiAp() InvocationTargetException e"); } catch (SecurityException e) { e.printStackTrace(); Log.d(TAG, "stratWifiAp() SecurityException e"); } catch (NoSuchMethodException e) { e.printStackTrace(); Log.d(TAG, "stratWifiAp() NoSuchMethodException e"); } Log.i(TAG, "out startWifiAp() 启动一个Wifi 热点!"); return ret; }/** * 配置WiFi或者热点信息 * * @param wifiManager * WiFi管理器 * @param ssid * WiFi名称 * @param password * WiFi密码 * @param paramInt * WiFi加密方式 1为不加密,2为WEP加密,3为wpa加密 * @param wifiType * “wifi”为打开普通WiFi连接,“ap”为创建WiFi热点 * @return */public static WifiConfiguration createWifiInfo(WifiManager wifiManager,String ssid, String password, int paramInt, String wifiType) {WifiConfiguration Config1 = new WifiConfiguration();Config1.allowedAuthAlgorithms.clear();Config1.allowedGroupCiphers.clear();Config1.allowedKeyManagement.clear();Config1.allowedPairwiseCiphers.clear();Config1.allowedProtocols.clear();if ("wifi".equals(wifiType)) {Config1.SSID = ("\"" + ssid + "\"");WifiConfiguration Config2 = isExsits(wifiManager, ssid);if (Config2 != null) {if (wifiManager != null) {wifiManager.removeNetwork(Config2.networkId);}}if (paramInt == 1) {Config1.wepKeys[0] = "";Config1.allowedKeyManagement.set(0);Config1.wepTxKeyIndex = 0;return Config1;} else if (paramInt == 2) {Config1.hiddenSSID = true;Config1.wepKeys[0] = ("\"" + password + "\"");return Config1;} else {Config1.preSharedKey = ("\"" + password + "\"");Config1.hiddenSSID = true;Config1.allowedAuthAlgorithms.set(0);Config1.allowedGroupCiphers.set(2);Config1.allowedKeyManagement.set(1);Config1.allowedPairwiseCiphers.set(1);Config1.allowedGroupCiphers.set(3);Config1.allowedPairwiseCiphers.set(2);return Config1;}} else {WifiConfiguration wifiApConfig = new WifiConfiguration();wifiApConfig.allowedAuthAlgorithms.clear();wifiApConfig.allowedGroupCiphers.clear();wifiApConfig.allowedKeyManagement.clear();wifiApConfig.allowedPairwiseCiphers.clear();wifiApConfig.allowedProtocols.clear();wifiApConfig.SSID = ssid;if (paramInt == 1) // WIFICIPHER_NOPASS 不加密{wifiApConfig.wepKeys[0] = "";wifiApConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);wifiApConfig.wepTxKeyIndex = 0;return wifiApConfig;}if (paramInt == 2) // WIFICIPHER_WEP WEP加密{wifiApConfig.hiddenSSID = true;wifiApConfig.wepKeys[0] = password;wifiApConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);wifiApConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);wifiApConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);wifiApConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);wifiApConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);wifiApConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);wifiApConfig.wepTxKeyIndex = 0;return wifiApConfig;}if (paramInt == 3) // WIFICIPHER_WPA wpa加密{wifiApConfig.preSharedKey = password;wifiApConfig.hiddenSSID = true;wifiApConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);wifiApConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);wifiApConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);wifiApConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);// config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);wifiApConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);wifiApConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);wifiApConfig.status = WifiConfiguration.Status.ENABLED;return wifiApConfig;}}return null;}/** * 连接WiFi热点 * * @param wifiManager * WiFi管理器 * @param wifiConfig * 需要连接的WiFi网络的配置对象 * @return 返回WiFi热点是否连接成功 */public static boolean connectHotspot(WifiManager wifiManager,WifiConfiguration wifiConfig) {Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig)");// 新创建的网络配置的idint wcgID = wifiManager.addNetwork(wifiConfig);Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) wcID = "+ wcgID);if (wcgID < 0) {return false;}Log.i(TAG, "out enableNetwork(WifiConfiguration wifiConfig)");return wifiManager.enableNetwork(wcgID, true);}/** * 利用反射,调用WiFi热点链接方法 * * @param wifiManager * @param wifiName * 热点名 * @param password * 热点密码 * @return */public static boolean connectHotPointForReflect(WifiManager wifiManager,String wifiName, String password) {Method getWifiConfig;WifiConfiguration myConfig;try {getWifiConfig = wifiManager.getClass().getMethod("getWifiApConfiguration", null);myConfig = (WifiConfiguration) getWifiConfig.invoke(wifiManager,null);myConfig.SSID = "\"" + wifiName + "\"";myConfig.preSharedKey = "\"" + password + "\"";Method setWifiConfig = wifiManager.getClass().getMethod("setWifiApConfiguration", WifiConfiguration.class);setWifiConfig.invoke(wifiManager, new Object[] { myConfig, true });Method enableWifi = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);enableWifi.invoke(wifiManager, null, false);WifiConfiguration newConfiguration = (WifiConfiguration) wifiManager.getClass().getMethod("getWifiApConfiguration", null).invoke(wifiManager, null);return (Boolean) enableWifi.invoke(wifiManager, newConfiguration,true);} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;}}public static boolean connectHotPointForReflect2(WifiManager wifiManager,WifiConfiguration wifiConfig) {try {Method enableWifi = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);enableWifi.invoke(wifiManager, null, false);return (Boolean) enableWifi.invoke(wifiManager, wifiConfig, true);} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();return false;}}/** * 关闭WiFi热点 * * @param wifiManager * WiFi管理器 * @return 返回关闭状态 */public static boolean closeWifiHotPoint(WifiManager wifiManager) {Log.i(TAG, "into closeWifiAp() 关闭一个Wifi 热点!");boolean ret = false;if (isWifiApEnabled(wifiManager)) {try {Method method = wifiManager.getClass().getMethod("getWifiApConfiguration");method.setAccessible(true);WifiConfiguration config = (WifiConfiguration) method.invoke(wifiManager);Method method2 = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class,boolean.class);ret = (Boolean) method2.invoke(wifiManager, config, false);} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Log.i(TAG, "out closeWifiAp() 关闭一个Wifi 热点!");return ret;}/** * 检测WiFi热点是否可用 * * @param wifiManager * WiFi管理器 * @return 是否可用状态 */public static boolean isWifiApEnabled(WifiManager wifiManager) {try {Method method = wifiManager.getClass().getMethod("isWifiApEnabled");method.setAccessible(true);return (Boolean) method.invoke(wifiManager);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return false;}/** * 通过反射,获取WiFi热点名称 SSID * * @param wifiManager * @return */public static String getApSSID(WifiManager wifiManager) {try {Method localMethod = wifiManager.getClass().getDeclaredMethod("getWifiApConfiguration", new Class[0]);if (localMethod == null)return null;Object localObject1 = localMethod.invoke(wifiManager, new Object[0]);if (localObject1 == null)return null;WifiConfiguration localWifiConfiguration = (WifiConfiguration) localObject1;if (localWifiConfiguration.SSID != null)return localWifiConfiguration.SSID;Field localField1 = WifiConfiguration.class.getDeclaredField("mWifiApProfile");if (localField1 == null)return null;localField1.setAccessible(true);Object localObject2 = localField1.get(localWifiConfiguration);localField1.setAccessible(false);if (localObject2 == null)return null;Field localField2 = localObject2.getClass().getDeclaredField("SSID");localField2.setAccessible(true);Object localObject3 = localField2.get(localObject2);if (localObject3 == null)return null;localField2.setAccessible(false);String str = (String) localObject3;return str;} catch (Exception localException) {}return null;}/** * 获取WiFi热点的状态 * * @param wifiManager * WiFi管理器 * @return */public int getWifiApState(WifiManager wifiManager) {try {int i = ((Integer) wifiManager.getClass().getMethod("getWifiApState", new Class[0]).invoke(wifiManager, new Object[0])).intValue();return i;} catch (Exception localException) {}return 4; // 未知wifi网卡状态}/** * 判断选择的WiFi热点是否可以连接 * * @param ssid * WiFi热点名 SSID * @param wifiList * 附近的WiFi列表 * @return true 可以连接 false 不可以连接(不在范围内) */public static boolean checkCoonectHotIsEnable(String ssid,List<ScanResult> wifiList) {for (ScanResult result : wifiList) {if (result.SSID.equals(ssid)) {return true;}}return false;}/** * 检查wifi列表中是否有以输入参数为名的wifi热点,如果存在,则在开始配置wifi网络之前将其移除,以避免ssid的重复 * * @param wifiManager * @param SSID * @return */private static WifiConfiguration isExsits(WifiManager wifiManager,String paramString) {Iterator<WifiConfiguration> localIterator = wifiManager.getConfiguredNetworks().iterator();WifiConfiguration localWifiConfiguration;do {if (!localIterator.hasNext())return null;localWifiConfiguration = (WifiConfiguration) localIterator.next();} while (!localWifiConfiguration.SSID.equals("\"" + paramString + "\""));return localWifiConfiguration;}public static List<WifiConfiguration> getWifiConfigurations(WifiManager wifiManager) {List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();return existingConfigs;}}
MainActivity.java------主界面activity
package com.lizhipeng.wifiHotPoint.activity;import java.util.List;import com.common.holderandadapter.CommonAdapter;import com.example.wifipointdemo.R;import com.lizhipeng.wifiHotPoint.activity.utils.WiFiUtil;import com.lizhipeng.wifiHotPoint.activity.utils.WifiHotspotUtils;import android.app.Activity;import android.content.Context;import android.net.wifi.ScanResult;import android.net.wifi.WifiConfiguration;import android.net.wifi.WifiManager;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener ,OnItemClickListener{private Button mCreateWifiButton;private Button mSearchWifiButton;private ListView mWifiListView;private List<ScanResult> mWifiInfos;private WifiManager mWifiManager;private WifiConfiguration configuration;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main_activity);initView();// 初始化组件initData();// 初始化数据}private void initData() {mCreateWifiButton.setOnClickListener(this);mSearchWifiButton.setOnClickListener(this);mWifiListView.setOnItemClickListener(this);}private void initView() {mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);mCreateWifiButton = (Button) findViewById(R.id.main_activity_btn_create);mSearchWifiButton = (Button) findViewById(R.id.main_activity_btn_search);mWifiListView = (ListView) findViewById(R.id.main_activity_lv_wifi);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.main_activity_btn_create:// 点击创建WiFi热点按钮configuration = WifiHotspotUtils.createWifiInfo(mWifiManager, "li-----", "12345678", 3, "ap");boolean res = WifiHotspotUtils.createWiFiAP(mWifiManager, configuration, true);if (!res) {Toast.makeText(this, "WiFi热点创建失败", Toast.LENGTH_SHORT).show();}else {Toast.makeText(this, "WiFi热点创建成功", Toast.LENGTH_SHORT).show();}break;case R.id.main_activity_btn_search:// 点击搜索WiFi按钮WifiHotspotUtils.closeWifiHotPoint(mWifiManager);//连接前,先关闭WiFi热点WiFiUtil.OpenWifi(mWifiManager);//打开WiFimWifiInfos = WiFiUtil.getWifiList(mWifiManager);mWifiListView.setAdapter(new MyAdapter(this, mWifiInfos,R.layout.item_wifi_listview));//mWifiListView.setAdapter(new MyAdapter(this, WifiHotPointUtils.getWifiConfigurations(mWifiManager),R.layout.item_wifi_listview));break;default:break;}}class MyAdapter extends CommonAdapter<ScanResult> {public MyAdapter(Context context, List<ScanResult> mDatas,int itemLayoutId) {super(context, mDatas, itemLayoutId);}@Overridepublic void convert(ViewHolder helper, ScanResult item) {helper.setText(R.id.item_wifi_listview_tv, item.toString());}}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {ScanResult scanResult = mWifiInfos.get(position);String ssid = scanResult.SSID;WifiConfiguration config = WifiHotspotUtils.createWifiInfo(mWifiManager, ssid, "12345678", 3, "wifi");boolean result = WifiHotspotUtils.connectHotspot(mWifiManager, config);if (result) {Toast.makeText(this, ssid+"WiFi热点连接成功"+position, Toast.LENGTH_SHORT).show();} else {Toast.makeText(this, ssid+"WiFi热点连接失败"+position, Toast.LENGTH_SHORT).show();}}}WiFi热点的创建代码为
WifiConfiguration configuration = WifiHotspotUtils.createWifiInfo(mWifiManager, "li-----", "12345678", 3, "ap");boolean res = WifiHotspotUtils.createWiFiAP(mWifiManager, configuration, true);
WiFi热点的链接代码为
WifiConfiguration config = WifiHotspotUtils.createWifiInfo(mWifiManager, ssid, "12345678", 3, "wifi");boolean result = WifiHotspotUtils.connectHotspot(mWifiManager, config);
其中的ssid为热点账号,“12345678”为密码,系统指定为8位以上。具体的大家根据实际情况做修改。
界面也很简单
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="38dp" android:background="@color/lightcyan" android:orientation="horizontal" > <ImageButton android:id="@+id/main_activity_ib_left_back" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/main_activity_tv_tittle" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:text="手机热点" /> <ImageButton android:id="@+id/main_activity_ib_right_scan" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/main_activity_btn_create" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="创建热点" /> <Button android:id="@+id/main_activity_btn_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索热点" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击热点进行连接" /> </LinearLayout> <ListView android:id="@+id/main_activity_lv_wifi" android:layout_width="wrap_content" android:layout_height="wrap_content" > </ListView></LinearLayout>
适配器是我修改了鸿洋的博客中的万能适配器,这里感谢鸿洋。
package com.common.holderandadapter;import java.util.List; import android.content.Context; import android.graphics.Bitmap;import android.util.SparseArray;import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView;import android.widget.TextView;/** * 特别牛逼的Adapter * @author lizhipeng * * @param <T> */public abstract class CommonAdapter<T> extends BaseAdapter { protected LayoutInflater mInflater; protected Context mContext; protected List<T> mDatas; protected final int mItemLayoutId; public CommonAdapter(Context context, List<T> mDatas, int itemLayoutId) { this.mContext = context; this.mInflater = LayoutInflater.from(mContext); this.mDatas = mDatas; this.mItemLayoutId = itemLayoutId; } @Override public int getCount() { return mDatas.size(); } @Override public T getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder = getViewHolder(position, convertView, parent); convert(viewHolder, getItem(position)); return viewHolder.getConvertView(); } public abstract void convert(ViewHolder helper, T item); private ViewHolder getViewHolder(int position, View convertView, ViewGroup parent) { return ViewHolder.get(mContext, convertView, parent, mItemLayoutId, position); } public static class ViewHolder { private final SparseArray<View> mViews; private int mPosition; private View mConvertView; /** * ViewHolder 的构造函数 * @param context 上下文 * @param parent 父布局 * @param layoutId 填充的布局ID * @param position item 的位置 */ private ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mPosition = position; this.mViews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); // setTag mConvertView.setTag(this); } /** * 拿到一个ViewHolder对象 * * @param context 上下文 * @param convertView 复用的View * @param parent 父View * @param layoutId 布局文件ID * @param position item 的位置 * @return */ public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutId, position); } return (ViewHolder) convertView.getTag(); } public View getConvertView() { return mConvertView; } /** * 通过控件的Id获取对于的控件,如果没有则加入views * * @param viewId * @return 返回View */ public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } /** * 为TextView设置字符串 * * @param viewId * @param text * @return */ public ViewHolder setText(int viewId, String text) { TextView view = getView(viewId); view.setText(text); return this; } /** * 为ImageView设置图片 * * @param viewId * @param drawableId * @return */ public ViewHolder setImageResource(int viewId, int drawableId) { ImageView view = getView(viewId); view.setImageResource(drawableId); return this; } /** * 为ImageView设置图片 * * @param viewId * @param drawableId * @return */ public ViewHolder setImageBitmap(int viewId, Bitmap bm) { ImageView view = getView(viewId); view.setImageBitmap(bm); return this; } /** * 当前的位置 * @return */ public int getPosition() { return mPosition; } } }
好了,至此整片demo的代码都在了,由于Mac本没有找到合适的软件,所以连续几篇博客都没有上图。还望大家见谅,谁有好的软件,给我分享一下,谢谢。
下次给大家分享基于WiFi的通信实现。欲知后事如何,请听下回分解!
转载请注明出处。
- Android WiFi功能实现,知其然必知其所以然! (二)
- Android WiFi功能实现,知其然必知其所以然!(一)
- Android WiFi功能实现,知其然必知其所以然!(一)
- 知其所以然(续)
- 知其所以然(续)
- 知其所以然
- 知其所以然
- IDA知其所以然
- 知其所以然
- 原理-知其所以然
- 知其然,知其所以然之Java基础系列(二)
- 知其所以然地学习(转载)
- 剖析 Android 属性动画,知其然知其所以然(上)
- 知其然,知其所以然!
- 知其然 知其所以然
- 知其然,知其所以然!
- 知其然更要知其所以然
- 知其然,然后知其所以然
- UVA11384正整数序列(把123..变成0的最小步数)
- HDU - 1863 - 畅通工程 (最小生成树!!prim算法!!)
- 收藏一篇jcr资源库的文章,
- 求1+2+…+n
- iOS界面-页面和动画切换
- Android WiFi功能实现,知其然必知其所以然! (二)
- 关闭php notice提示
- AForge 拍照 GetCurrentVideoFrame().GetHbitmap 内存不足
- {笨方法学Elasticsearch}测试cluster.routing.allocation.disable_allocation
- UVA11389巴士司机问题
- CentOS 7 修改时区
- 输入和输出--重定向标准输入和输出
- 学习笔记141230
- [oracle] rownum 及 选取排序后的前N条数据