startDiscovery函数不起作用;安卓开发;蓝牙权限问题;安卓扫描不到蓝牙设备

在安卓开发过程中遇到蓝牙扫描不到周围设备的问题,细看代码发现是bluetoothAdapter.startDiscovery()函数出现问题,该函数的作用及运行过程可以自己去别的地方看,大致过程就是:
创建一个线程用于蓝牙设备查找,
1.开始时会广播ACTION_DISCOVERY_STARTED消息,
2.找到一个设备广播一次ACTION_FOUND消息,
3.扫描结束后会广播ACTION_DISCOVERY_FINISHED消息
接下来介绍出现扫描不到周围设备的问题的原因:
1.网上最常见的回答:
在原来的App的AndroidManifest.xml中加入权限声明

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage" />

2.函数调用前权限再次检查,本人使用的环境 targetSdkVersion 30,好像是比较新的安卓版本,对于权限管理比较严格,所以要在函数调用前再次检查蓝牙相关权限,调用我定义的如下checkPermissions函数即可。


    private boolean checkPermissions(){
        //本app需要以下权限
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.BLUETOOTH},0);
            System.out.println("-------已经申请了蓝牙权限1------");
        }else{
            System.out.println("-------已经拥有了蓝牙权限权限1------");
        }
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.BLUETOOTH_ADMIN},0);
            System.out.println("-------已经申请了蓝牙权限2------");
        }else{
            System.out.println("-------已经拥有了蓝牙权限权限2------");
        }
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},0);
            System.out.println("-------已经申请了定位权限1------");
        }else{
            System.out.println("-------已经拥有了定位权限1------");
        }
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},0);
            System.out.println("-------已经申请了定位权限2------");
        }else{
            System.out.println("-------已经拥有了定位权限2------");
        }
        return true;
    }

总结

越新的安卓版本对权限管理的越严格,大家再用到啥权限的时候,不仅要在AndroidManifest.xml文件中声明好,还要在具体的代码段前再次检查权限,防止没有起到功能。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值