定位服务(HMS Core)

华为定位服务(HUAWEI Location Kit)采用 GPS、Wi-Fi、基站等多途径的混合定位模式进行定位,赋予应用开发者快速、精准地获取用户位置信息的能力,构建全球定位服务能力,助力开发者发展全球业务。当前华为定位服务的主要能力包含三个部分:融合定位、活动识别和地理围栏,开发者可以根据自己的需求,调用相应的能力。

  • 融合定位:结合 GPS、Wi-Fi 和基站位置数据,为应用开发者提供一套简单易用的 API,方便开发者快速获取设备位置信息。

  • 活动识别:通过加速度传感器、蜂窝网络信息、磁力计识别用户运动状态,便于开发者通过了解用户行为来调整应用程序。

  • 地理围栏:应用开发者通过 API 设置感兴趣的位置区域,在指定操作(如离开、进入、驻留)发生时,即可及时收到一个通知。

主要功能

融合定位

如果应用需要请求设备位置信息,开发者可以为应用申请位置权限,然后调用 HMS Core 的请求位置更新接口 requestLocationUpdates(),根据需要指定定位方式,获取持续的位置信息回调。如果获取位置信息后,想取消位置信息回调,可以调用移除位置更新接口 removeLocationUpdates(),达到取消回调的目的。

活动识别

如果应用需要获取设备的运动状态,例如:步行、跑步、骑自行车等,或者应用需要检测用户的运动状态变化,那么开发者可以为应用申请活动状态识别权限,通过调用活动状态识别更新接口 createActivityIdentificationUpdates(),获取当前用户的活动状态,而移除活动识别更新只需要调用 deleteActivityIdentificationUpdates() 接口即可。如果需要检测用户的运动状态变化,那么可以调用活动状态转换接口 createActivityConversionUpdates(),通过此接口可以监听当前设备的活动状态转换,而移除监听时,只需要调用 deleteActivityConversionUpdates() 接口即可。

地理围栏

如果开发者对某些地点比较关注,可以根据关注地点的位置,创建地理围栏 createGeofenceList(),地理围栏可以感知当前设备所在位置和关注目标之间的距离,当用户进入围栏区域时,会向应用发起通知。同时,开发者可以检测用户在围栏内的停留时间,当用户在围栏内停留一段时间之后,再发起通知。

地理围栏同时支持页面操作,通过基于地图的拖拽和参数填写创建地理围栏,详情参见 服务端开发

一键接入定位服务

开通服务

  • 使用 Cocos Creator 打开需要接入定位服务的项目工程。

  • 点击菜单栏的 面板 -> 服务,打开 服务 面板,选择 定位服务,进入服务详情页。然后点击右上方的 启用 按钮即可开通服务。详情可参考 服务面板操作指南

  • 参考 华为定位服务开发准备 文档,完成开发者注册、创建应用、生成/配置签名证书指纹以及打开相关服务

  • 定位服务可以直接使用,无需在 AppGallery Connect 后台额外操作。

配置华为参数文件

大部分的华为相关项目都需要用到 agconnect-services.json 配置文件。若有新开通服务等操作,请及时更新该文件。

  • 登录 AppGallery Connect 后台,在 项目列表 -> 应用列表 中找到对应的应用。
  • 项目设置 页面的 应用 区域,点击 agconnect-services.json 下载配置文件。agconnect-services.json 文件在下载或者更新完成后,必须手动拷贝 到工程目录的 settings 目录下。

验证服务是否接入成功

  • 完成 定位服务 接入步骤后,我们便可以通过在脚本中添加简单的代码来验证接入是否成功。

    huawei.hms.location.locationService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_LOCATION_PERMISSION, (result) => {
        if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success)
        {
            console.log('requestLocationPermission...', 'success');
        } else {
            console.log('requestLocationPermission...', 'fail:', result.errMsg);
        }
    });
    
    huawei.hms.location.locationService.requestLocationPermission();
    
  • 代码添加完成后,即可 发布到 Android 平台,请确保 构建发布 面板中的包名与华为后台设置的包名一致。

  • 工程第一次运行到手机后,若弹出申请位置权限的对话框(见下图),即表示接入成功。

  • 若已经申请过权限可在 Logcat 中查看日志。

Sample 工程

开发者可以通过 Sample 工程快速体验定位服务。

  • 点击定位服务面板中的 Sample 工程 按钮,Clone 或下载 HUAWEI Sample 工程,并在 Cocos Creator 中打开。

  • 参照上文开通分析服务并配置华为参数文件后,可通过 Creator 编辑器菜单栏的 项目 -> 构建发布 打开 构建发布 面板来构建编译工程。Creator v2.4.1 及以上版本,可 发布到 HUAWEI AppGallery Connect,Creator v2.4.1 以下的版本可 发布到 Android 平台

  • 需要在已安装 HMS Core 服务的华为或荣耀品牌手机上测试。

  • Sample 工程运行到手机后,点击首页的 Location 按钮,即可进入功能界面进行测试。

开发指南

定位服务所有的 API 均是异步回调。可使用 huawei.hms.location.locationService.once 获取单次回调,或者使用 huawei.hms.location.locationService.on 监听回调。

定位服务

huawei.hms.location.locationService

可参考 定位服务开发步骤 文档。

检查应用权限

checkLocationSettings(): void

检查位置服务相关应用权限。

示例

huawei.hms.location.locationService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_LOCATION_SETTINGS, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('checkLocationSettings...', 'success');
    } else {
        console.log('checkLocationSettings...', 'fail:', result.errMsg);
    }
});

huawei.hms.location.locationService.checkLocationSettings();

动态申请位置权限

requestLocationPermission(): void

该方法用于动态申请位置权限。

示例

huawei.hms.location.locationService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_LOCATION_PERMISSION, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) 
    {
        console.log('requestLocationPermission...', 'success');
    } else {
        console.log('requestLocationPermission...', 'fail:', result.errMsg);
    }
});

huawei.hms.location.locationService.requestLocationPermission();

持续获取位置信息

requestLocationUpdates(): void

该方法用于在应用中持续获取设备的位置。

示例

huawei.hms.location.locationService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_REQUEST_LOCATION_UPDATE, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('requestLocationUpdates...', 'success');
    } else {
        console.log('requestLocationUpdates...', 'fail:', result.errMsg);
    }
});

huawei.hms.location.locationService.requestLocationUpdates();

removeLocationUpdates(): void

当开发者的应用程序不再需要接收位置更新时,应当停止位置更新,以便降低功耗。

示例

huawei.hms.location.locationService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_REMOVE_LOCATION_UPDATE, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('removeLocationUpdates...', 'success');
    } else {
        console.log('removeLocationUpdates...', 'fail:', result.errMsg);
    }
});

huawei.hms.location.locationService.removeLocationUpdates();

获取最后的已知位置

getLastLocation(): void

返回最后一次请求的可用位置。该接口并不会主动请求位置,将使用上一次请求的缓存位置。

以下场景可能导致返回 null:

  • 从未使用过定位功能。
  • 位置开关关闭。
  • 恢复出厂设置。

如果对位置的实时性有较高要求,推荐主动调用 requestLocationUpdates 替代调用 getLastLocation

示例

huawei.hms.location.locationService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_LAST_LOCATION, (location) => {
    if (location.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('getLastLocation...', 'success', lon:' + location.longitude + ",lat:" + location.latitude);
    } else {
        console.log('getLastLocation...', 'fail:', location.errMsg);
    }
});

huawei.hms.location.locationService.getLastLocation();

使用模拟位置信息功能

该功能用于测试环境。
打开 Android 手机的 设置 页面,点击 系统和更新 -> 开发人员选项 -> 选择模拟位置信息应用 -> 选择要 mock 的应用 即可开启该功能。如果没有找到 “开发人员选项”,请在 设置 页面的 关于手机 -> 版本号 上连续点击 7 次,“开发人员选项” 便会出现在 “系统和更新” 页面中。

在 AndroidManifest.xml 文件中配置模拟定位权限。

<uses-permission
android:name="android.permission.ACCESS_MOCK_LOCATION"
tools:ignore="MockLocation,ProtectedPermissions" />

设置 mock 模式

setMockMode(mockMode: boolean): void

设置为 true 时,将不再使用 GPS 或网络位置,直接返回通过 setMockLocation 设置的位置信息(setMockLocation 的设置见下方)。

传入参数

参数 说明
mockMode 若调用该方法并设置为 true,则打开 mock 模式。若不再需要使用 mock 模式,则需要设置为 false

示例

huawei.hms.location.locationService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_MOCK_MODE, (result) => {
    if (location.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('setMockMode...', 'success');
    } else {
        console.log('setMockMode...', 'fail:', result.errMsg);
    }
});

huawei.hms.location.locationService.setMockMode(true);

设置模拟位置信息

setMockLocation(latitude: string, longitude: string): void

调用此方法之前必须先调用 setMockMode 并设置为 true

参数说明

参数 说明
latitude 经度值
longitude 纬度值

示例

huawei.hms.location.locationService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_MOCK_LOCATION, (result) => {
    if (location.code === huawei.hms.location.LocationActivityService.StatusCode.success)
    {
        console.log('setMockLocation...', 'success');
    } else {
        console.log('setMockLocation...', 'fail:', result.errMsg);
    }
});

//set longitude and latitude
huawei.hms.location.locationService.setMockLocation(24.4813889,118.1590724);

活动识别服务

huawei.hms.location.locationActivityService

可参考 活动识别服务开发步骤 文档。

动态申请活动识别权限

requestRecognitionPermission(): void

活动识别权限 属于危险权限,使用时需要动态申请。

示例

huawei.hms.location.locationActivityService.requestRecognitionPermission();

注册活动识别更新

createActivityIdentificationUpdates(intervalMillis: number): void

可参考 注册活动识别更新 文档。

参数说明

参数 说明
intervalMillis 活动检测更新间隔,对应 Java 侧 long 型。以毫秒为单位,值越大,活动检测越少,值越小,活动检测越频繁。

示例

huawei.hms.location.locationActivityService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_CREATE_ACTIVITY_IDENTIFICATION_UPDATES, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('requestActivityUpdates...', 'success');
    } else {
        console.log('requestActivityUpdates...', 'fail:', result.errMsg);
    }
});

huawei.hms.location.locationActivityService.createActivityIdentificationUpdates(parseInt(time) || 5000);

设置活动识别更新监听

需要设置监听来获取活动识别更新时的返回信息,无主动调用方法。

示例

huawei.hms.location.locationActivityService.on(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_ACTIVITY_UPDATES, (result) => {
    console.log('HMS_ACTIVITY_UPDATES...', JSON.stringify(result));
}, this);

huawei.hms.location.locationActivityService.on(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_CONVERSION_UPDATES, (result) => {
    //todo
    console.log('HMS_CONVERSION_UPDATES...', JSON.stringify(result));
}, this);

移除活动识别更新

deleteActivityIdentificationUpdates(): void

移除所有活动识别更新。

示例

huawei.hms.location.locationActivityService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_REMOVE_ACTIVITY_CONVERSION_UPDATES, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('deleteActivityUpdates...', 'success');
    } else {
        console.log('deleteActivityUpdates...', 'fail:', result.errMsg);
    }
}); 

huawei.hms.location.locationActivityService.deleteActivityIdentificationUpdates();

活动过渡更新

createActivityConversionUpdates(params: any): void

接口提供检测活动转换条件(进入、退出)的功能,例如需要检测用户从走路变为骑自行车的状态等。

示例

huawei.hms.location.locationActivityService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_CREATE_ACTIVITY_CONVERSION_UPDATES, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('createActivityConversionUpdates...', 'success');
    } else {
        console.log('createActivityConversionUpdates...', 'fail:', result.errMsg);
    }
});
let cls = huawei.hms.location.ConversionInfo;
let type = huawei.hms.location.ACTIVITY_IDENTIFICATION_ENUM;
let cType = huawei.hms.location.ACTIVITY_CONVERSION_TYPE;
let infoList = [
    new cls(type.STILL, cType.ENTER_ACTIVITY_CONVERSION),
    new cls(type.STILL, cType.EXIT_ACTIVITY_CONVERSION),
];

huawei.hms.location.locationActivityService.createActivityConversionUpdates(infoList);

移除活动过渡更新

deleteActivityConversionUpdates(): void

移除活动过渡更新。

示例

huawei.hms.location.locationActivityService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_REMOVE_ACTIVITY_CONVERSION_UPDATES, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('deleteActivityConversionUpdates...', 'success');
    } else {
        console.log('deleteActivityConversionUpdates...', 'fail:', result.errMsg);
    }
});

huawei.hms.location.locationActivityService.deleteActivityConversionUpdates();

地理围栏服务

huawei.hms.location.locationGeofenceService

可参考 地理围栏服务开发步骤 文档。

设置地理围栏监听

示例

huawei.hms.location.locationGeofenceService.on(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_RECEIVE_GEOFENCE_DATA, (result) => {
    console.log('HMS_RECEIVE_GEOFENCE_DATA...', JSON.stringify(result));
}, this);

创建添加地理围栏的请求

createGeofenceList(list: Array<GeofenceData>, type: HMS_LOCATION_GEOFENCEREQUEST)

示例

huawei.hms.location.locationGeofenceService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_CREATE_GEOFENCE_LIST, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('createGeofenceList...', 'success');
    } else {
        console.log('createGeofenceList...', 'fail:', result.errMsg);
    }
});
let cls = huawei.hms.location.GeofenceData;
let type = huawei.hms.location.GEOFENCE_TYPE;
let list = [
    new cls(
        this.editBox.string,    //setUniqueId
        type.DWELL_GEOFENCE_CONVERSION | type.ENTER_GEOFENCE_CONVERSION | type.EXIT_GEOFENCE_CONVERSION,  //setConversions
        24.4813889,             //setRoundArea, latitude
        118.1590724,            //setRoundArea, longitude
        2000,                   //setRoundArea, radius
        60 * 60 * 1000,         //setValidContinueTime
        1000                    //setDwellDelayTime
)];
let requestType = huawei.hms.location.HMS_LOCATION_GEOFENCEREQUEST;
let initType = requestType.EXIT_INIT_CONVERSION | requestType.ENTER_INIT_CONVERSION | requestType.DWELL_INIT_CONVERSION;
console.log('createGeofenceList...', 'params=', JSON.stringify(list), 'init type=', initType);

huawei.hms.location.locationGeofenceService.createGeofenceList(list, initType);

移除地理围栏

removeWithIntent(): void

示例

huawei.hms.location.locationGeofenceService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_REMOVE_GEOFENCE_WITH_INTENT, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('removeWithIntent...', 'success');
    } else {
        console.log('removeWithIntent...', 'fail:', result.errMsg);
    }
});

huawei.hms.location.locationGeofenceService.removeWithIntent();

通过 ID 移除地理围栏

removeWithID(removeID: string): void

示例

huawei.hms.location.locationGeofenceService.once(huawei.hms.location.HMS_LOCATION_EVENT_LISTENER_NAME.HMS_REMOVE_GEOFENCE_WITH_ID, (result) => {
    if (result.code === huawei.hms.location.LocationActivityService.StatusCode.success) {
        console.log('removeWithID...', 'success');
    } else {
        console.log('removeWithID...', 'fail:', result.errMsg);
    }
});

var removeID = "ID1";
huawei.hms.location.locationGeofenceService.removeWithID(removeID);

API 文档

详细的功能接口和 API 说明,请参考 位置服务 - API 文档

results matching ""

    No results matching ""