public class MainAbility extends Ability {
Locator locator;
MyLocatorCallback locatorCallback;
RequestParam requestParam;
final int REQUEST_LOCATION_CODE = 12; // 定义常量 用来表示请求码
// 创建一个静态成员变量 数据共享
public static Location location = null;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(MainAbilitySlice.class.getName());
// 动态判断权限
if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED) {
// 应用未被授予权限
if (canRequestPermission("ohos.permission.LOCATION")) {
// 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
requestPermissionsFromUser(new String[]{"ohos.permission.LOCATION"}, REQUEST_LOCATION_CODE);
LogUtil.info("canRequestPermission() running");
} else {
// 显示应用需要权限的理由,提示用户进入设置授权
LogUtil.info("显示应用需要权限的理由");
}
} else {
initLocator();
// 权限已被授予
LogUtil.info("权限已被授予,直接启动服务");
}
}
@Override // 权限操作调用的方法
public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_LOCATION_CODE: {
// 匹配requestPermissions的requestCode
if (grantResults.length > 0
&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {
LogUtil.info("onRequestPermissionsFromUserResult权限被授予");
// 权限被授予
// 注意:因时间差导致接口权限检查时有无权限,所以对那些因无权限而抛异常的接口进行异常捕获处理
initLocator();
} else {
// 权限被拒绝
LogUtil.info("onRequestPermissionsFromUserResult权限被拒绝");
}
return;
}
}
}
private void initLocator() {
locator = new Locator(this); // 创建local对象
// 实例化RequestParam对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。
requestParam = new RequestParam(RequestParam.SCENE_NAVIGATION);
// 实现 locatorCallback 接口对象
locatorCallback = new MyLocatorCallback();
// locator.requestOnce(requestParam, locatorCallback); // 请求一次
locator.startLocating(requestParam, locatorCallback); // 多次请求 直接启动服务
}
@Override
protected void onStop() {
super.onStop();
locator.stopLocating(locatorCallback); // 程序结束 停止服务
}
// 创建MyLocatorCallback类,实现LocatorCallback接口,用于执行定位过程的回调方法
public class MyLocatorCallback implements LocatorCallback {
@Override // 获取定位结果
public void onLocationReport(Location location) { // 使用静态成员变量 进行分享
LogUtil.info("onLocationReport:" + location.getLongitude() + "," + location.getLatitude());
if (location != null) {
MainAbility.location = location;
}
}
@Override // 获取定位过程中的状态信息
public void onStatusChanged(int type) {
LogUtil.info("onStatusChanged:" + type);
}
@Override // 获取定位过程中的错误信息
public void onErrorReport(int type) {
LogUtil.info("onErrorReport:" + type);
}
}
}