如何实现Android状态栏的Wi-Fi搜索周边的列表和周围Wi-Fi强度图标切换?
我想要实现例如Android状态栏以及筛选列表一样:链接之后就显示当前Wi-Fi信号状态图标,扫描之后进行周围链接的信号强度的显示。
本问题代码主要参考的是这篇文章:
How can I get Android Wifi Scan Results into a list?
第一个问题
实现的结果是都在一行。
在hashmap遍历中,我尝试获得多个效果:
代码:
this.adapter = new SimpleAdapter( //设置适配器为简单适配器
MainActivity.this, //获取主要实例
arraylist, R.layout.wifi_scanresults_row, //适配器获取布局
new String[]{ITEM_KEY},
new int[]{R.id.wifi_item}); //设置资源ID为textView
/*new int[]{R.id.wifi_security};
new int[]{R.id.wifi_StrongImage});*/
listView.setAdapter(this.adapter); //设置适配器
...
@SuppressLint("StringFormatInvalid")
@Override
public void onClick(View v) {
arraylist.clear(); //清除数据列表
wifi.startScan(); //开始扫描附近Wi-Fi
try { //异常捕获
size = size - 1;
while (size >= 0) { //当size大于等于0时
HashMap<String, String> item = new HashMap<>();
//wifiname.setText(getString(R.string.wifi_name, "" + results.get(size).SSID));
//wifisec.setText(getString(R.string.wifi_security, "" + results.get(size).capabilities));
// wifiImage.setImageLevel(getLayoutInflater(R.layout.wifi_sel, "" + listView.get()));
item.put(ITEM_KEY, results.get(size).SSID + "\n" + results.get(size).capabilities); //获取Wi-Fi结果
arraylist.add(item); //添加wifi进列表
size--; //size自减
adapter.notifyDataSetChanged(); //通知数据设置改变
}
} catch (Exception e) //捕获异常
{ }
我的xml:
main.wifi_connect,主要的扫描结果,参考第一个链接,使用了hashmap遍历的方法获取。
scan_resuals_row:扫描结果的布局,我尝试做出类似于系统扫描Wi-Fi列表那样,可是imageview显示不出。
参考链接:Android连接指定Wifi的方法
不过他用的是RecyclerView,我是用的是第一个链接里的ListView,切换的成本是否很大?
代码:
<?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="...dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingStart="10dp"
android:paddingEnd="10dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_vertical"
android:paddingStart="10dp"
android:paddingEnd="10dp"
>
<TextView
android:id="@+id/wifi_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="@string/wifi_name"
android:textSize="18sp" />
<TextView
android:id="@+id/wifi_security"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/wifi_security"
android:textSize="14sp"/>
</LinearLayout>
<ImageView
android:id="@+id/wifi_StrongImage"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:scaleType="fitXY"
/>
</LinearLayout>
</RelativeLayout>
显示的效果:
图为选择ImageView的效果。
第二个问题
根据强弱切换图标的参考链接:
Android获取当前已连接的wifi信号强度的方法
我创建的xml:
selector.xml:切换信号强度的图标的选择器,参考第二个链接。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/ic_signal_wifi_4_bar_black_24dp">
</item>
<item
android:state_pressed="false"
android:drawable="@drawable/ic_perm_scan_wifi_black_24dp">
</item>
<item
android:state_window_focused="false"
android:drawable="@drawable/ic_signal_wifi_statusbar_null_black_26x24dp">
</item>
</selector>
目前我的代码仅仅是点击button变化的代码,并没有做到获得周围的Wi-Fi代码,或许是在代码中被自己注释的原因,或许是只可以获得周边的Wi-Fi,但和第一个问题一样布局的imageview没显示出来。
在声明wifi消息处理过程中,Wi-Fi不同state分别是有无反应,是否连接上,这与Wi-Fi的值(就是信号强度)有什么关系?
// 声明wifi消息处理过程
private BroadcastReceiver wifiIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int wifi_state = intent.getIntExtra("wifi_state", 0);
int level = Math.abs(((WifiManager)getSystemService(WIFI_SERVICE)).getConnectionInfo().getRssi());
switch (wifi_state) {
case WifiManager.WIFI_STATE_DISABLING:
wifi_image.setImageResource(R.drawable.wifi_sel);
wifi_image.setImageLevel(level);
break;
case WifiManager.WIFI_STATE_DISABLED:
wifi_image.setImageResource(R.drawable.wifi_sel);
wifi_image.setImageLevel(level);
break;
case WifiManager.WIFI_STATE_ENABLING:
wifi_image.setImageResource(R.drawable.wifi_sel);
wifi_image.setImageLevel(level);
break;
case WifiManager.WIFI_STATE_ENABLED:
wifi_image.setImageResource(R.drawable.wifi_sel);
wifi_image.setImageLevel(level);
break;
case WifiManager.WIFI_STATE_UNKNOWN:
wifi_image.setImageResource(R.drawable.wifi_sel);
wifi_image.setImageLevel(level);
break;
}
}
};
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论