为什么安卓6.0需要开启定位才能搜索蓝牙ble设备

为什么安卓6.0需要开启定位才能搜索蓝牙ble设备,第1张

Android6.0以后,权限进行了改动。

在Android 6.0,原来的蓝牙功能,发现扫描蓝牙设备时,无磨告法获取到蓝牙设备;因为在6.0后,蓝牙这块增加一个动态权限;需要在程序中动态申请。

6.0及后续版本,使用蓝牙扫描,来需要添加如下的权限,且该权限还需要在使用时动态申请:

<!-- Android6.0 蓝牙扫描才需要-->

<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>

3)动态申请权手游缓限

//判毕模断是否有权限

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

//请求权限

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},

MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION)

//判断是否需要 向用户解释,为什么要申请该权限

if(ActivityCompat.shouldShowRequestPermissionRationale(this,

Manifest.permission.READ_CONTACTS)) {

Toast.makeText(this, "shouldShowRequestPermissionRationale", Toast.LENGTH_SHORT).show()

}

}

//权限申请结果

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]

grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults)

}

我的也是一样,这薯轿种情况可以考虑先将中控内蓝牙控制里面已连接设备,找到自己的手机,删除。然后再重新连接一次,不过安卓6.0系统暂时还不完善,除了蓝牙之外,耗电量羡厅也高很多啊!估计你的手机也是才升级的吧~呵呵,等稍后有了稳定点的版本后估计数派肆会好很多的。

最近总是有用户反馈说APP扫描不到设备,让我很费解了一段时间,尤其是华为和OPPO,公司还专门买了这款手机,然后测试没问题,直到一个偶然,我把手机定位给关了,才发现这个问题,Android 6.0 扫描设备需开启位置权限,用户突然一天把定位给关了,我们在扫描之前又没检测,唉,一个逻辑不严谨就会出现各种问题,现在记录一下

权限获取

<uses-permission android:name="android.permission.BLUETOOTH"/>使用者搜搏蓝牙所需要的权限

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>使用扫描和设置蓝牙的权限(申明这一个权限必须申明上面一个权限)

在Android5.0之前,是默认申请GPS硬件功能的。而在Android 5.0 之后,需要在manifest 中申明GPS硬件模块功能的使用。

<!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->

    <uses-feature android:name="android.hardware.location.gps" />

在 Android 6.0 及以上,还需要打开位置权限。如果应用没有位置权限,蓝牙扫描功能不能使用(其它漏谈蓝牙 *** 作例如连接蓝牙设备和写入数据不受影响)

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

除了上面的设置之外,如果想设置设备只支持 BLE,可以加上下面这句话

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

同样,如果不想添加 BLE 的支持,那么可以设置 required="false"

然后可以在运行时判断设备是否支持 BLE,

// Use this check to determine whether BLE is supported on the device. Then

    // you can selectively disable BLE-related features.

    if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {

        Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show()

        finish()

    }

打开定位 (Location)

首先检查定位是否打开,可以首祥像下面这样 *** 作:

/**

* Location service if enable

*

* @param context

* @return location is enable if return true, otherwise disable.

*/

public static final boolean isLocationEnable(Context context) {

    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE)

    boolean networkProvider = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

    boolean gpsProvider = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)

    if (networkProvider || gpsProvider) return true

    return false

}

如果定位已经打开,可以搜索到 ble 设备;如果定位没有打开,则需要用户去打开,像下面这样:

private static final int REQUEST_CODE_LOCATION_SETTINGS = 2

private void setLocationService() {

    Intent locationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)

    this.startActivityForResult(locationIntent, REQUEST_CODE_LOCATION_SETTINGS)

}

进入定位设置界面,让用户自己选择是否打开定位。选择的结果获取:

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_CODE_LOCATION_SETTINGS) {

        if (isLocationEnable(this)) {

            //定位已打开的处理

        } else {

            //定位依然没有打开的处理

        }

    } else super.onActivityResult(requestCode, resultCode, data)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12480075.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-24
下一篇2023-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存