Wi-fi扫描广播接收器不起作用

问题描述

我目前正在开发一个简单的Wi-fi扫描仪android应用程序 具有最低API级别26和目标API级别28

我想实时更新扫描结果,所以我创建了一个广播接收器,但是它没有按预期工作。

注意:我已经尝试过 Wifi scan results broadcast receiver not workingBroadcast receiver with wifi scan not working

请注意,我不想通过清单文件来明确广播接收者

我将感谢您。

下面是我的Java代码

package com.example.quickshare;
import androidx.appcompat.app.AppCompatActivity;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;

public class ActivitySend extends AppCompatActivity {

    WifiManager wifiManager;
    ListView ScanList;
    List<ScanResult> results;
    listadapter listadapter;
    WifiReceiver wifiReceiver;
    IntentFilter intentFilter;
    TextView msg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send);
        wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        CheckWifiStatus();
        msg = findViewById(R.id.wifiStatus);
        intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

        intentFilter.addAction(WifiManager.EXTRA_RESULTS_UPDATED);

        try {
            getApplicationContext().registerReceiver(wifiReceiver,intentFilter);
        }
        catch(Exception e){
            System.out.println(e);
        }
        boolean success = wifiManager.startScan();
        if(success)
            Toast.makeText(ActivitySend.this,"Scanning",Toast.LENGTH_SHORT).show();

    }

    @Override
    protected void onResume() {
        super.onResume();
        CheckWifiStatus();
        registerReceiver(wifiReceiver,intentFilter);

        wifiManager.startScan();
        results = wifiManager.getScanResults();
        if (results.size() > 0)
             Toast.makeText(ActivitySend.this,"Scan Successful",Toast.LENGTH_LONG).show();
        else
             Toast.makeText(ActivitySend.this,"No Device Available",Toast.LENGTH_LONG).show();
             ScanList = findViewById(R.id.ScanList);
             listadapter = new listadapter(getApplicationContext(),results);
             ScanList.setAdapter(listadapter);
             ScanList.setonItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
                public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
                   Toast.makeText(ActivitySend.this,"Selected" + results.get(position).SSID,Toast.LENGTH_LONG).show();
                   //Todo: Establish Connection with selected SSID
                }
             });
        }

    class WifiReceiver extends broadcastReceiver{
        @Override
        public void onReceive(Context context,Intent intent) {
            Toast.makeText(ActivitySend.this,"Available Device list changed",Toast.LENGTH_LONG).show();
            //Todo: Append SSID of new Available APs in ListView and arrange a callback to onResume().
        }
    }

    public void CheckWifiStatus(){
        if (!wifiManager.isWifiEnabled()){
            wifiManager.setWifiEnabled(true);
            Toast.makeText(ActivitySend.this,"Wifi turned 'On' Successfully",Toast.LENGTH_SHORT).show();
            msg.setText("Wifi Status : ON");
        }
    }

    @Override
    protected void onPause() {
        unregisterReceiver(wifiReceiver);
        super.onPause();
    }
}

使用上述Java代码,我可以在启动活动之前扫描可用的AP(如果可用)。 启动此活动后,扫描结果没有任何变化,即使我关闭了该AP,它也始终显示以前获取的结果。

解决方法

为了检测到AP断开连接,您的intentFilter缺少ConnectivityManager.CONNECTIVITY_ACTION

你可以听 通过以下行执行这些操作:

intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

此外,您需要在其他代码块中添加括号,即

if {
    // ...
} else {

    Toast.makeText(ActivitySend.this,"No Device Available",Toast.LENGTH_LONG).show();
    ScanList = findViewById(R.id.ScanList);
    // ...
}