下面是基于实际的项目得到的具体步骤及核心代码
1、权限问题
先判断手机是否满足android4.3以上版本,再判断手机是否开启蓝牙 主要涉及蓝牙权限和位置权限,注意不同android版本之间权限申请的差异,以及android权限动态申请和静态申请的区别
//动态申请权限相关
private String[] requestPermissionArray = new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
//Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
};
/**
* 初始化权限
*/
public void initNeedPermissions() {
/**Android 6.0以上动态申请权限*/
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
final PermissionRequest permissionRequest = new PermissionRequest();
permissionRequest.requestRuntimePermission(MainActivity.this, requestPermissionArray, new PermissionListener() {
@Override
public void onGranted() {
Log.d(TAG,"所有权限已被授予");
}
/**用户勾选“不再提醒”拒绝权限后,关闭程序再打开程序只进入该方法!*/
@Override
public void onDenied(List<String> deniedPermissions) {
deniedPermissionList = deniedPermissions;
for (String deniedPermission : deniedPermissionList) {
Log.e(TAG,"被拒绝权限:" + deniedPermission);
}
}
});
}
}
静态权限
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
2、 设备是否支持
使用蓝牙之前,首先要检查当前手机是否支持BLE蓝牙。 如果支持BLE蓝牙,检查手机蓝牙是否已开启。如果没有开启,则需要先打开蓝牙。打开手机蓝牙,有两种方式,一种是直接enable()打开,另外一种是提示用户打开,推荐第二种方式。
/**
* 检测手机是否支持4.0蓝牙
* @param context 上下文
* @return true--支持4.0 false--不支持4.0
*/
private boolean checkBle(Context context){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { //API 18 Android 4.3
bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
if(bluetoothManager == null){
return false;
}
bluetooth4Adapter = bluetoothManager.getAdapter(); //BLUETOOTH权限
if(bluetooth4Adapter == null){
return false;
}else{
Log.d(TAG,"该设备支持蓝牙4.0");
return true;
}
}else{
return false;
}
}
/**
* 获取蓝牙状态
*/
public boolean isEnable(){
if(bluetooth4Adapter == null){
return false;
}
return bluetooth4Adapter.isEnabled();
}
/**
* 打开蓝牙
* @param isFast true 直接打开蓝牙 false 提示用户打开
*/
public void openBluetooth(Context context,boolean isFast){
if(!isEnable()){
if(isFast){
Log.d(TAG,"直接打开手机蓝牙");
bluetooth4Adapter.enable(); //BLUETOOTH_ADMIN权限
}else{
Log.d(TAG,"提示用户去打开手机蓝牙");
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
context.startActivity(enableBtIntent);
}
}else{
Log.d(TAG,"手机蓝牙状态已开");
}
}
3、搜索设备
搜索蓝牙:搜索蓝牙,回调接口中查看ble设备相关信息,一定时间停止扫描 扫描设备是耗时的操作,一旦扫描结束,就要及时停止扫描。
//扫描设备
//扫描设备回调
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(BluetoothDevice bluetoothDevice, int rssi, byte[] bytes) {
//在onLeScan()回调中尽量做少的操作,可以将扫描到的设备扔到另一个线程中处理
if(bluetoothDevice == null)
return;
if(bluetoothDevice.getName() != null){
Log.d(TAG,bluetoothDevice.getName() + "-->" + bluetoothDevice.getAddress());
}else{
Log.d(TAG,"null" + "-->" + bluetoothDevice.getAddress());
}
BLEDevice bleDevice = new BLEDevice(bluetoothDevice,rssi);
if(onDeviceSearchListener != null){
onDeviceSearchListener.onDeviceFound(bleDevice); //扫描到设备回调
}
}
};
/**
* 设置时间段 扫描设备
* @param onDeviceSearchListener 设备扫描监听
* @param scanTime 扫描时间
*/
public void startDiscoveryDevice(OnDeviceSearchListener onDeviceSearchListener,long scanT