add location helper

This commit is contained in:
DevWiki 2024-09-06 17:05:31 +08:00
parent 7f9c4bc663
commit 15223b7de4
4 changed files with 82 additions and 42 deletions

View File

@ -1,5 +1,10 @@
import { Context } from '@ohos.arkui.UIContext';
import { window } from '@kit.ArkUI';
import { abilityAccessCtrl } from '@kit.AbilityKit';
import { Log } from '@devwiki/base';
import { BusinessError } from '@kit.BasicServicesKit';
const TAG = '[MyApp]'
export class MyApp {
@ -20,4 +25,19 @@ export class MyApp {
MyApp.mainWindow = window;
MyApp.uiContext = window.getUIContext();
}
static requestBasicPermission() {
let atManager = abilityAccessCtrl.createAtManager();
try {
atManager.requestPermissionsFromUser(MyApp.uiAbilityContext,
['ohos.permission.INTERNET'])
.then((data) => {
Log.i(TAG, 'requestBasicPermission, data:' + data.permissions[0])
})
.catch((err: BusinessError) => {
Log.i(TAG, 'requestBasicPermission, error:' + err.message)
})
} catch (err) {
}
}
}

View File

@ -13,6 +13,8 @@ export default class AppAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
MyApp.initAbility(this.context);
MyApp.requestBasicPermission();
}
onDestroy(): void {
@ -22,7 +24,6 @@ export default class AppAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
MyApp.initAbility(this.context);
windowStage.loadContent('pages/Index', (err, data) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');

View File

@ -1,6 +1,7 @@
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult } from '@kit.AbilityKit';
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { LocationHelper } from '../../utils/LocationHelper';
@Component
@Entry({routeName: 'MapPage'})
@ -10,32 +11,12 @@ struct MapPage {
@State isLocationPermission: boolean = false;
@State locText: string = ''
checkLocationPermission() {
let manager = abilityAccessCtrl.createAtManager() // 得到manager对象
let appInfo =
bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION) // 获取应用信息
this.appName = appInfo.name;
let context: Context = getContext(this) as common.UIAbilityContext;
let permission:string = 'ohos.permission.LOCATION'
let status = manager.checkAccessTokenSync(appInfo.appInfo.accessTokenId, "ohos.permission.LOCATION")
if (status === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
this.isShowLocationPopup = true;
manager.requestPermissionsFromUser(context, ['ohos.permission.LOCATION'], (err: BusinessError, data: PermissionRequestResult) => {
});
} else {
this.getLocationAddress();
}
}
requestionLocationPermission() {
}
locationHelper: LocationHelper = new LocationHelper(getContext(this) as common.UIAbilityContext);
@Builder
locationViewBuilder() {
Row() {
Text('开启定位权限,为您推荐附近商家与好物 ').fontSize(15);
Text('开启定位权限').fontSize(15);
Button('去开启')
.type(ButtonType.Normal)
.height(24)
@ -44,7 +25,6 @@ struct MapPage {
.backgroundColor(Color.Red)
.onClick(() => {
if (this.isLocationPermission) {
this.checkLocationPermission()
}
})
@ -73,23 +53,8 @@ struct MapPage {
}
aboutToAppear(): void {
this.checkLocationPermission()
}
this.locationHelper.requestPermissionsFromUser((allowScope: boolean, allowPrecision: boolean) => {
getLocationAddress() {
let reverseGeocodeRequest:geoLocationManager.ReverseGeoCodeRequest = {"latitude": 31.12, "longitude": 121.11, "maxItems": 1};
try {
geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
if (err) {
console.error('getAddressesFromLocation: err=' + JSON.stringify(err));
}
if (data) {
console.log('getAddressesFromLocation: data=' + JSON.stringify(data));
this.locText = data[0].placeName ?? '';
}
});
} catch (err) {
console.error("errCode:" + JSON.stringify(err));
}
})
}
}

View File

@ -0,0 +1,54 @@
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { geoLocationManager } from '@kit.LocationKit';
const locationPermission: Permissions[] = ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'];
export class LocationHelper {
appInfo: bundleManager.BundleInfo;
context: common.UIAbilityContext;
atManager: abilityAccessCtrl.AtManager;
constructor(context: common.UIAbilityContext) {
this.context = context;
this.atManager = abilityAccessCtrl.createAtManager();
this.appInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION) // 获取应用信息
}
checkLocationPermission(callback: (isAllow: boolean) => void) {
let status = this.atManager.checkAccessTokenSync(this.appInfo.appInfo.accessTokenId, locationPermission[0])
callback(status === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
}
gotoSystemSetting() {
}
/**
* 请求定位 allowScope是否允许定位, allowPrecision: 是否允许获取精确位置
* @param callback
*/
requestPermissionsFromUser(callback: (allowScope: boolean, allowPrecision: boolean) => void): void {
this.atManager.requestPermissionsFromUser(this.context, locationPermission)
.then((data: PermissionRequestResult) => {
callback(data.authResults[1] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED,
data.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED);
})
.catch((err: BusinessError) => {
console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
})
}
getLocationAddress(latitude: number, longitude: number, maxItems: number, callback:(error: BusinessError, data: geoLocationManager.GeoAddress[]) => void) {
let reverseGeocodeRequest:geoLocationManager.ReverseGeoCodeRequest = {"latitude": latitude, "longitude": longitude, "maxItems": maxItems};
try {
geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
callback(err, data);
});
} catch (err) {
console.error("errCode:" + JSON.stringify(err));
}
}
}