以下是个人在开发蓝牙的过程中遇到的一些问题的总结,也希望能够帮助到刚开发android 蓝牙的程序猿,能够让你们少踩一些坑。

1.在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"/>


2.动态申请定位权限:

由于android6.0及以上系统需动态申请敏感权限,部分机型需获取定位权限ACCESS_COARSE_LOCATION方可扫描到蓝牙设备。另开发过程中,还会遇到部分机型(如华为mate10)即便已获取定位权限,但仍扫描不到设备,后经排查发现如果手机的GSP定位开关如果未打开,也扫描不到设备。所以我们在蓝牙扫描之前还需要加一下如下判断:

public static final boolean isLocationEnable(Context context) {
     LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
     boolean isNetEnable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
     boolean isGpsEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
     if (isNetEnable || isGpsEnable ) {        return true;
    }
     return false;
 }

以上方法用来判断定位开关是否打开。

如果未打开定位,可以通过如下方法去设置打开:

 Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
 startActivityForResult(intent, REQUEST_CODE);
 

3.启动和关闭蓝牙:

1.判断当前android设备是否支持蓝牙(比如当我们使用模拟器调试时,由于我们的模拟器不支持蓝牙功能,所以在使用蓝牙功能时,一定要记得多加一个判断,否则就很有可能导致app crash):


BluetoothAdapter blueAdapter = BluetoothAdapter.getDefaultAdapter(); // 获取蓝牙适配器
if( blueAdapter == bull ) { // 表示手机不支持蓝牙
    return;    // 后续不可进行蓝牙相关的操作
}


2.蓝牙扫描前常用操作:

blueAdapter .isEnabled()   表示当前蓝牙是否可用; blueAdapter.enable()  去打开蓝牙;blueAdapter.disable()关闭蓝牙适配器。

3.蓝牙扫描与停止扫描:

mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
        // device 是扫描到的蓝牙设备,可以通到device实例对象获取到其mac地址、name等
        // rssi 表示扫描到的蓝牙设备与此手机之间的瞬时信号强度
        // scanRecord 表示当前蓝牙设备所携带的广播包的信息,例如可以通过读取内部数据判断是否为本公            
        // 司的产品    
        
    }
};

blueAdapter.startLeScan(mLeScanCallback);  // 开始扫描

blueAdapter.stopLeScan(mLeScanCallback);  // 停止扫描

注意:当我们不需要扫描时,一定要记得停止扫描,避免造成不必要的内存消耗。

今天先写到这里,后续还会写一些关于蓝牙连接、通讯的文章,欢迎大家继续关注,以上如有不足之处,还请多多包涵~