Skip to content

智石室内定位 Android API

简介

智石科技室内定位 Android API,是由 Java 语言编写的应用程序接口,它能够帮助您在移动端中构建功能丰富、交互性强的室内定位程序。本开发包支持的Android版本为19或更高的系统。

准备工作

了解了室内地图基础流程后,接下来进行室内地图开发的准备工作。

  • 您需要成为智石的用户;
  • 获取BuildlingID、Appkey,请在(开放平台>建筑与地图>建筑管理)中查看;

开发指南

AndroidStudio项目配置

创建AndroidStudio项目

在Android Studio中创建一个Android项目。

集成SDK

1. 下载开发包

https://github.com/BrightBeacon/IndoorPositionSDK-Android

2. 添加库到项目

复制SDK内的库文件到{工程}/app/libs 目录里,如下图示:

3. 配置build.gradle

在工程目录下的build.gradle文件中 allprojects 块中的 repositories 标签内配置 flatDir 标签,如果没有则新增,代码如下:

java
allprojects {
	repositories {
		...
		// 添加配置以下标签
		flatDir {
			dirs 'libs'
		}
	}
}

在app目录下的build.gradle文件中android块中配置sourceSets标签和compileOptions标签,如果没有使用标签则新增,详细配置代码如下:

javascript
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

sourceSets {
    main {
        jniLibs.srcDir(['libs'])
    }
}

在app目录下的build.gradle文件中 dependencies 块中配置库引用

java
// 智石科技室SDK基础库
implementation(name: 'BRTMapData-release-2.3.1', ext: 'aar')

// 智石科技室内定位库
implementation(name: 'BRTLocationLibrary-release-2.3.1', ext: 'aar')

配置权限

1. 添加权限声明

在工程AndroidManifest.xml文件中添加权限声明:

java
<!-- 用于在线校验智石开发密钥, 获取定位数据 -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- 用于室内定位数据的保存和加载 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<!-- 蓝牙扫描权限,用于扫描蓝牙Beacon定位信标. -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

<!-- 安卓6.0及以后系统需要声明以下权限,才能扫描到蓝牙Beacon信标 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- 如果APP编译targetSdk>=31(即安卓12及以上版本),需声明以下权限 -->
<!-- 蓝牙扫描权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- 蓝牙连接权限,控制蓝牙开关 (该权限可选,以便APP请求开启蓝牙) -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
2. 申请运行时权限
java
private static final int REQUST_PERMISSION_CODE = 1000;

private void checkPermissions() {
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
		List<String> permissions = new ArrayList<>();
		// 安卓6及以上版本需要申请的相关权限
		permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
		permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
		
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
			// 安卓12及以上版本需要申请的相关权限
			permissions.add(Manifest.permission.BLUETOOTH_CONNECT);
			permissions.add(Manifest.permission.BLUETOOTH_SCAN);
		} else {
			// 安卓11以下版本需要申请的相关权限
			permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
			permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    	}
		requestPermissions(permissions.toArray(new String[0]), REQUST_PERMISSION_CODE);
	}
}

添加定位功能

以下代码是在Activity onCreate方法中初始化定位引擎:

java
private BRTLocationManager locationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 请在确认运行权限申请完成后,初始化地图引擎
    locationManager = new BRTLocationManager(context, buildingId, appkey);
    // 添加定位回调监听
	locationManager.addLocationEngineListener(locationManagerListener);
	// 开启室内定位功能
	locationManager.startUpdateLocation();
}

@Override
protected void onDestroy() {
    if (locationManager != null) {
    	locationManager.stopUpdateLocation();
    	locationManager = null;
    }
    super.onDestroy();
}

private BRTLocationManager.BRTLocationManagerListener locationManagerListener = new BRTLocationManager.BRTLocationManagerListener() {

    @Override
    public void didRangedBeacons(BRTLocationManager BRTLocationManager, List<BRTBeacon> list) {
        // 扫描到的蓝牙信标列表。
    }

    @Override
    public void didRangedLocationBeacons(BRTLocationManager BRTLocationManager, List<BRTPublicBeacon> list) {
        // 扫描到当前建筑定位蓝牙信标列表。
    }

    @Override
    public void didFailUpdateLocation(BRTLocationManager BRTLocationManager, final Error error) {
        //	定位引擎初始化错误或者定位失败。
    }

    @Override
    public void didUpdateDeviceHeading(BRTLocationManager BRTLocationManager, double v) {
        //	定位方向更新
    }

    @Override
    public void didUpdateImmediateLocation(BRTLocationManager BRTLocationManager, final BRTLocalPoint tyLocalPoint) {
        //	即时位置更新(仅通过蓝牙信标计算后获取的位置数据)
    }

    @Override
    public void didUpdateLocation(BRTLocationManager BRTLocationManager, BRTLocalPoint tyLocalPoint) {
        //	步行位置更新(通过惯性和步行判断,平滑处理后的位置数据)
    }
};

常用API展示

java
// 设置是否限制计算定位的蓝牙信标数量
locationManager.setLimitBeaconNumber(true);

// 设置用于计算定位的蓝牙信标的最大数量。setLimitBeaconNumber(true)时有效。
locationManager.setMaxBeaconNumberForProcessing(5);

合规使用指南

SDK如何处理个人信息请参见隐私政策:隐私政策

您集成和使用我们的SDK时需要遵从个人信息保护基本要求,详情请参见:合规使用指南

关于