为了账号安全,请及时绑定邮箱和手机立即绑定

WiFi getSSID() 总是返回“<unknown ssid>”

WiFi getSSID() 总是返回“<unknown ssid>”

慕神8447489 2022-06-23 20:29:44
很多人已经问过这个问题,但是对他们有用的解决方案对我不起作用。我在 Android 8.1 和 Android 9.0 上测试过,无法获取 SSID 的名称。用于获取 WiFi 状态变化的广播接收器:private final BroadcastReceiver mReceiver = new BroadcastReceiver() {    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        if(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION) ||                intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION) ||                intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION) ||                intent.getAction().equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION) ||                intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {            setWifiIndicator();        }    }};接收器在 中注册onCreate和注销onDestroy,我认为这是正确的,并且在调用接收器时我看到了日志行。在onCreate:IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(ScannerService.ACTION_READ_SCANNER);intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);registerReceiver(mReceiver, intentFilter);setWifiIndicator();setWifiIndicator是这样实现的:private void setWifiIndicator() {    ConnectivityManager connMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);    //getApplicationContext solves memory leak issues prior to Android N (must use Application Context to get wifi system service.    WifiManager wifiMgr = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);    ImageView wifiIndicator = (ImageView)findViewById(R.id.wifi_indicator);    TextView wifiSSID = (TextView)findViewById(R.id.wifi_ssid);  
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

Wi-Fi 权限


安卓 8.0 和安卓 8.1:


成功调用 WifiManager.getScanResults() 需要以下任一权限:


• ACCESS_FINE_LOCATION • ACCESS_COARSE_LOCATION • CHANGE_WIFI_STATE


如果调用应用程序没有任何这些权限,则调用将失败并出现 SecurityException。


安卓 9:


成功调用 WifiManager.startScan() 需要满足以下所有条件:


• 您的应用具有 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限。• 您的应用拥有 CHANGE_WIFI_STATE 权限。• 设备上启用了定位服务(在设置 > 位置下)。


Android 10(API 级别 29)及更高版本:


成功调用 WifiManager.startScan() 需要满足以下所有条件:


• 如果您的应用面向Android 10(API 级别29)SDK 或更高版本,则您的应用拥有ACCESS_FINE_LOCATION 权限。


• 如果您的应用面向低于 Android 10(API 级别 29)的 SDK,则您的应用具有 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限。


• 您的应用拥有 CHANGE_WIFI_STATE 权限。


• 设备上启用了定位服务(在设置 > 位置下)。


并请求用户级别的权限来实现


有关更多信息,请参阅此链接:https ://developer.android.com/guide/topics/connectivity/wifi-scan#wifi-scan-permissions


XAMARIN 表单代码更改:


如果(Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O){

状态 = 等待 CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);

如果(状态!= PermissionStatus.Granted)

{   

var 结果 = 等待 CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Location });

状态=结果[权限.位置];

}

}

//img1.sycdn.imooc.com//62b45d2a00018f0710160394.jpg

查看完整回答
反对 回复 2022-06-23
?
MYYA

TA贡献1868条经验 获得超4个赞

你有没有试过检查是否getSupplicantState()是COMPLETED?


if(wifiInfo.getSupplicantState() == SupplicantState.COMPLETED){

        String ssid = wifiInfo.getSSID();

        wifiSSID.setText(ssid);

}

另外,您在运行之前BroadcastReceiver或什至在内部都可以做到这一点:


 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION);

}else{setWifiIndicator(); 


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 408 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信