如何解决Wi-fi扫描广播接收器不起作用
我目前正在开发一个简单的Wi-fi扫描仪android应用程序 具有最低API级别26和目标API级别28 。
我想实时更新扫描结果,所以我创建了一个广播接收器,但是它没有按预期工作。
注意:我已经尝试过 Wifi scan results broadcast receiver not working,Broadcast 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);
// ...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。