Android 接入指南
SDK支持平台
- Android 5.0及以上版本
Proguard
-keep class cn.icomon.icdevicemanager.ICDeviceManager { *; }
-keep class cn.icomon.icdevicemanager.ICBluetoothSystem { *; }
-keep public interface cn.icomon.icdevicemanager.ICBluetoothSystem$ICBluetoothDelegate { *; }
-keep public class cn.icomon.icdevicemanager.ICBluetoothSystem$ICOPBleCharacteristic { *; }
-keep public enum cn.icomon.icdevicemanager.ICBluetoothSystem$ICOPBleWriteDataType { *; }
-keep class cn.icomon.icdevicemanager.manager.setting.ICSettingManagerImpl { *; }
-keep class cn.icomon.icdevicemanager.manager.algorithms.ICBodyFatAlgorithmsImpl { *; }
-keep class cn.icomon.icdevicemanager.ICDeviceManagerDelegate { *; }
-keep class cn.icomon.icdevicemanager.model.** { *; }
-keep class cn.icomon.icdevicemanager.ICDeviceManagerSettingManager { *; }
-keep public interface cn.icomon.icdevicemanager.ICDeviceManagerSettingManager$ICSettingCallback { *; }
-keep class com.icomon.icbodyfatalgorithms.** { *; }
-keep class cn.icomon.icbleprotocol.** { *; }
-keep class cn.icomon.icdevicemanager.ICBodyFatAlgorithmsManager { *; }
-keep class cn.icomon.icdevicemanager.ICBluetoothSystem.** { *; }
-keep class cn.icomon.icdevicemanager.callback.** { *; }
权限
AndroidManifest.xml 声明
<uses-permission
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30"/>
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30"/>
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
android:maxSdkVersion="30"/>
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="30"/>
<uses-permission
android:usesPermissionFlags="neverForLocation"
android:name="android.permission.BLUETOOTH_SCAN"/>
<uses-permission
android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission
android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="true"/>
动态获取权限说明:
- 1.
Android 6
至Android 11
需要动态获取ACCESS_FINE_LOCATION
和ACCESS_COARSE_LOCATION
权限 - 2.
Android 10
至Android 11
蓝牙扫描需要开启定位开关
- 3.
Android 12 及以上
需要动态获取BLUETOOTH_CONNECT
和BLUETOOTH_SCAN
权限
定位相关疑问请查阅Android官方: https://developer.android.com/guide/topics/connectivity/bluetooth
代码示例
检查是否已获取蓝牙扫描、连接所需要的权限
private boolean checkBLEConnectionPermission() {
boolean isGranted = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED) {
isGranted = true;
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
isGranted = true;
}
} else {
isGranted = true;
}
return isGranted;
}
请求获取蓝牙扫描、连接所需要的权限
private void requestBLEConnectionPermission() {
String[] arrayPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
arrayPermission = new String[]{Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN};
} else {
arrayPermission = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
}
ActivityCompat.requestPermissions(this, arrayPermission, CODE_REQUEST_PERMISSION);
}
Android 10
至 Android 11
定位开关相关
public static boolean needOpenGpsSwitch() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && Build.VERSION.SDK_INT <= Build.VERSION_CODES.R;
}
public static boolean isOpenGpsSwitch(Context context) {
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
return true;
} else {
return false;
}
}
导入SDK
SDK使用Java与C++混合开发,提供aar包进行导入.
因导入方式有多种,这里仅列出其中一种,导入步骤如下:
SDK接入流程
初始化SDK
调用ICDeviceManager.shared().initMgrWithConfig(cfg)
进行初始化SDK,在初始化之前,建议调用ICDeviceManager.shared().setDelegate(delegate)
设置好代理对象。否则可能会丢失部分回调。如:
ICDeviceManager.shared().setDelegate(this);
ICDeviceManager.shared().initMgrWithConfig(cfg);
扫描设备
SDK初始化完成后,如果需要查找附近的设备,可以调用扫描接口来进行扫描设备:
ICDeviceManager.shared().scanDevice(delegate);
设备将通过扫描回调代理对象进行回调(调用扫描接口前,请确保蓝牙是否开启,否则该接口不会生效,如正常扫描过程中关闭蓝牙,然后再次打开蓝牙,请重新调用该接口,SDK不会自动去开启扫描).
注: 如果已知道设备的mac地址,可以直接调用添加设备接口,不用调用扫描接口。SDK内部会自动去连接这个设备。
停止扫描
调用了扫描设备接口,在已经找到需要的设备后,请调用停止扫描(sdk不会自动停止):
ICDeviceManager.shared().stopScan();
添加设备
如果已经找到需要的设备了,调用添加设备接口:
ICDeviceManager.shared().addDevice(device,addCallback);
接口可以时SDK去连接设备并收取数据(请确保设备处于亮屏状态,否则SDK将会不会收到数据, 中途蓝牙关闭或设备息屏,当蓝牙重新开启或设备再次亮屏,SDK会自动去连接,无需再次添加设备或扫描设备).
删除设备
当不想SDK去连接和收取设备数据时,从SDK移除该设备,可以调用移除设备接口:
ICDeviceManager.shared().removeDevice(device,removeCallback);
更新用户信息
因为要计算用户的体脂以及一些其他数据,所以需要App调用更新用户信息接口:
ICDeviceManager.shared().updateUserInfo(userInfo);
日志目录
如出现SDK收不到数据或连接异常等情况,请把SDK日志发给我们,获取SDK日志目录:
ICDeviceManager.shared().getLogPath();
设备设置接口
部分设备支持设置单位或卡路里等属性,获取这些设置接口:
ICDeviceManager.shared().getSettingManager();
体脂算法接口
获取体脂算法接口:
ICDeviceManager.shared().getBodyFatAlgorithmsManager();