如何实现Android状态栏的Wi-Fi搜索周边的列表和周围Wi-Fi强度图标切换?

故事熊
  • 69

我想要实现例如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;
    }
  }
};

谢谢。

回复
阅读 1.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏