安卓开发笔记(十四)——获取wifi的信息,解决android6.0以上getScanResults()为空的情况

一. 解决android6.0以上getScanResults()为空的情况

在android6.0以下采用getScanResults()就可以获取手机扫描的wifi信息,然而在6.0以上却得不到之前的信息。

这主要的问题在于android6.0扫描wifi信息必须打开获取位置权限

解决方法:

1.在AndroidManifest.xml添加相应的静态权限

检查自己有没有上述四项权限

	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
2.在wifi获取信息之前动态申请权限,打开wifi以及gps
		// 判断wifi是否开启
        wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if(! wifi.isWifiEnabled()){
            if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING)
                wifi.setWifiEnabled(true);
        }
	{
	···
		// 判断是否有位置权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//如果 API level 是大于等于 23(Android 6.0) 时
            //判断是否具有权限
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                //判断是否需要向用户解释为什么需要申请该权限
                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.ACCESS_COARSE_LOCATION)) {
                    //showToast("自Android 6.0开始需要打开位置权限");
                }
                //请求权限
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                        REQUEST_CODE_ACCESS_COARSE_LOCATION);
            }
        }
     ···
     }
     
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CODE_ACCESS_COARSE_LOCATION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //用户允许改权限,0表示允许,-1表示拒绝 PERMISSION_GRANTED = 0, PERMISSION_DENIED = -1
                //permission was granted, yay! Do the contacts-related task you need to do.
                //这里进行授权被允许的处理
            } else {
                //permission denied, boo! Disable the functionality that depends on this permission.
                //这里进行权限被拒绝的处理
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
3.检查手机是否打开了wifi以及gps按钮

以上三步就能解决android6.0以上无法通过getScanResults()获取扫描信息的问题
以下是我的实验结果截图:
1

二. 获取wifi信息的源码

package dick.android.remotecontrol;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.List;

public class WifiCollector extends AppCompatActivity {
    WifiManager wifi;
    TextView show;
    Button button;
    private static final int REQUEST_CODE_ACCESS_COARSE_LOCATION = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wifi_data);
        show = (TextView) findViewById(R.id.wifi_ssid);
        button = findViewById(R.id.fresh);

        // 判断wifi是否开启
        wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if(! wifi.isWifiEnabled()){
            if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING)
                wifi.setWifiEnabled(true);
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//如果 API level 是大于等于 23(Android 6.0) 时
            //判断是否具有权限
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                //判断是否需要向用户解释为什么需要申请该权限
                if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                        Manifest.permission.ACCESS_COARSE_LOCATION)) {
                    //showToast("自Android 6.0开始需要打开位置权限");
                }
                //请求权限
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                        REQUEST_CODE_ACCESS_COARSE_LOCATION);
            }
        }

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 获取当前连接上的wifi相关信息
                 */
                WifiInfo info = wifi.getConnectionInfo();
                int strength = info.getRssi();
                int speed = info.getLinkSpeed();
                String bssid = info.getBSSID();
                String ssid = info.getSSID();
                String units = WifiInfo.LINK_SPEED_UNITS;
                String wifiinformation = "ScanResults is: \n";
                /**
                 * 获取扫描到的所有wifi相关信息
                 */
                List<ScanResult> results = wifi.getScanResults();
                for(ScanResult result:results){
                    wifiinformation += "bssid为:" + result.BSSID+ "   ssid为:"+result.SSID+"   强度为:"+result.level+"\n";
                }

                String text = "正连接的WiFi\nssid为:" + ssid + "\nbssid为:" +bssid + "\n连接速度为:" + String.valueOf(speed) + "  " + String.valueOf(units) + "\n强度为:" + strength;
                wifiinformation += "\n\n";
                wifiinformation += text;

                show.setText(wifiinformation);
            }
        });
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CODE_ACCESS_COARSE_LOCATION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //用户允许改权限,0表示允许,-1表示拒绝 PERMISSION_GRANTED = 0, PERMISSION_DENIED = -1
                //permission was granted, yay! Do the contacts-related task you need to do.
                //这里进行授权被允许的处理
            } else {
                //permission denied, boo! Disable the functionality that depends on this permission.
                //这里进行权限被拒绝的处理
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
获取Android设备的Wi-Fi所有信息,可以使用以下代码: 1. 在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ``` 2. 在代码中使用以下代码获取Wi-Fi所有信息: ```java WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); String ssid = wifiInfo.getSSID(); // 获取SSID String bssid = wifiInfo.getBSSID(); // 获取BSSID int ip = wifiInfo.getIpAddress(); // 获取IP地址 int networkId = wifiInfo.getNetworkId(); // 获取网络ID int speed = wifiInfo.getLinkSpeed(); // 获取连接速度 String macAddress = wifiInfo.getMacAddress(); // 获取MAC地址 int frequency = wifiInfo.getFrequency(); // 获取频率 int signalStrength = wifiInfo.getRssi(); // 获取信号强度 int signalLevel = WifiManager.calculateSignalLevel(signalStrength, 5); // 获取信号等级 String networkTypeName = getNetworkTypeName(wifiInfo.getNetworkType()); // 获取网络类型名称 String dhcpInfo = wifiManager.getDhcpInfo().toString(); // 获取DHCP信息 String supplicantStateName = wifiInfo.getSupplicantState().name(); // 获取当前连接状态 // 获取所有扫描到的Wi-Fi信息 List<ScanResult> scanResults = wifiManager.getScanResults(); for (ScanResult scanResult : scanResults) { String scanResultSsid = scanResult.SSID; // 获取SSID String scanResultBssid = scanResult.BSSID; // 获取BSSID int scanResultFrequency = scanResult.frequency; // 获取频率 int scanResultLevel = scanResult.level; // 获取信号强度 } ``` 注意:需要在AndroidManifest.xml文件中添加权限才能获取Wi-Fi信息。另外,获取到的信息可能不是实时的,需要根据实际情况进行判断和处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值