鸿蒙中位置权限和相机权限

1.module.json5中添加相关权限和string.json中配置信息

2.详情代码

import { hilog } from '@kit.PerformanceAnalysisKit';
import { TAG } from '@ohos/hypium/src/main/Constant';
import { bundleManager, common } from '@kit.AbilityKit';
import { abilityAccessCtrl } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { geoLocationManager } from '@kit.LocationKit';
import { intl } from '@kit.LocalizationKit';

@Entry
@Component
struct Index {
  @State locale: string = new intl.Locale().language;
  @State currentLocation: string = '';
  @State latitude: number = 0;
  @State longitude: number = 0;
  @State permissionsMessage: string | Resource = "\"获取当前位置\"需获取定位权限才能正常使用"
  @State locationServiceMessage: string | Resource =  "\"获取当前位置\"需获取定位权限才能正常使用"
  private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;


  // 相机权限-------start
  // 用户申请权限
  async reqPermissionsFromUser(): Promise<number[]> {
    hilog.info(0x0001, TAG, 'reqPermissionsFromUser start');
    let context = getContext() as common.UIAbilityContext;
    let atManager = abilityAccessCtrl.createAtManager();
    let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.CAMERA']);
    return grantStatus.authResults;
  }
  // 用户申请相机权限
  async requestCameraPermission() {
    let grantStatus = await this.reqPermissionsFromUser();
    for (let i = 0; i < grantStatus.length; i++) {
      if (grantStatus[i] === 0) {
        // 用户授权,可以继续访问目标操作
        hilog.info(0x0001, TAG, 'Succeeded in getting permissions.');
        AlertDialog.show({message:"相机权限已开启"})
      }
    }
  }
  // 相机权限-------end

  // 位置权限----------start
  checkPermissionGrant(): void {
    let hasPermission = false;
    let tokenId: number = 0;
    try {
      let bundleInfo: bundleManager.BundleInfo =
        bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
      tokenId = appInfo.accessTokenId;
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      hilog.error(0x0000, 'Index',
        `Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
    }

    try {
      let atManager = abilityAccessCtrl.createAtManager();
      let approximatelyLocation = atManager.checkAccessTokenSync(tokenId, 'ohos.permission.APPROXIMATELY_LOCATION');
      let location = atManager.checkAccessTokenSync(tokenId, 'ohos.permission.LOCATION');
      hasPermission = approximatelyLocation === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED &&
        location === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED;
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      hilog.error(0x0000, 'Index', `Failed to check access token. Code is ${err.code}, message is ${err.message}`);
    }
    if (hasPermission) {
      this.isLocationToggle();
    } else {
      this.requestPermissions();
    }
  }
  isLocationToggle(): void {
    let atManager = abilityAccessCtrl.createAtManager();
    let isLocationEnabled = geoLocationManager.isLocationEnabled();
    if (!isLocationEnabled) {
      atManager.requestGlobalSwitch(this.context, abilityAccessCtrl.SwitchType.LOCATION).then((data: boolean) => {
        if (data) {
          // this.isShowLocation = false;
          this.getLocation();
        } else {
          // this.isShowLocation = true;
          this.locationServiceMessage = "\"获取当前位置\"需打开设备位置服务才能获取当前位置。"
        }
      }).catch((err: BusinessError) => {
        hilog.error(0x0000, 'Index', 'data:' + JSON.stringify(err));
      });
    } else {
      // this.isShowLocation = false;
      this.getLocation();
    }
  }

  requestPermissions(): void {
    let atManager = abilityAccessCtrl.createAtManager();
    try {
      atManager.requestPermissionsFromUser(this.context, ['ohos.permission.APPROXIMATELY_LOCATION',
        'ohos.permission.LOCATION']).then((data) => {
        if (data.authResults[0] === -1 || data.authResults[1] === -1) {
          if (data.dialogShownResults && (data.dialogShownResults[0] || data.dialogShownResults[1])) {
            // this.isShowPermissions = true;
            if(data.authResults[0] === -1){
              this.permissionsMessage =  "\"获取当前位置\"需获取定位权限才能正常使用"
            } else {
              this.permissionsMessage = "\"获取当前位置\"需获取精确定位权限才能获取精确位置。"
            }
          } else {
            this.openPermissionsSetting();
            return;
          }
        } else {
          // this.isShowPermissions = false;
        }
        if (data.authResults[0] !== 0) {
          return;
        }
        this.isLocationToggle();
      }).catch((err: Error) => {
        hilog.error(0x0000, 'Index', 'requestPermissionsFromUser err:' + JSON.stringify(err));
      });
    } catch (err) {
      hilog.error(0x0000, 'Index', 'requestPermissionsFromUser err:' + JSON.stringify(err));
    }
  }
  private openPermissionsSetting(): void {
    let atManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionOnSetting(this.context, ['ohos.permission.APPROXIMATELY_LOCATION',
      'ohos.permission.LOCATION']).then((data: Array<abilityAccessCtrl.GrantStatus>) => {
      if (data[0] === -1 && data[1] === -1) {
        // this.isShowPermissions = true;
        this.permissionsMessage = "\"获取当前位置\"需获取定位权限才能正常使用"
        return;
      } else if (data[0] === 0 && data[1] === -1) {
        // this.isShowPermissions = true;
        this.permissionsMessage = "\"获取当前位置\"需获取精确定位权限才能获取精确位置。"
      } else {
        // this.isShowPermissions = false;
      }
      this.isLocationToggle();
    }).catch((err: BusinessError) => {
      hilog.error(0x0000, 'Index', 'data:' + JSON.stringify(err));
    });
  }

  getLocation(): void {
    let request: geoLocationManager.SingleLocationRequest = {
      'locatingTimeoutMs': 10000,
      'locatingPriority': geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED
    };
    // Get current location.
    geoLocationManager.getCurrentLocation(request).then((location) => {
      this.latitude = location.latitude;
      this.longitude = location.longitude;
      let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = {
        'locale': this.locale.toString().includes('zh') ? 'zh' : 'en',
        'latitude': this.latitude,
        'longitude': this.longitude,
        'maxItems': 1
      };
      // Call the inverse geocoding service to convert coordinates into geographic descriptions.
      geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest).then((data) => {
        if (data[0].placeName) {
          this.currentLocation = data[0].placeName;
          AlertDialog.show({message:this.currentLocation})
        }
      }).catch((err: BusinessError) => {
        hilog.error(0x0000, 'Index', 'GetAddressesFromLocation err:' + JSON.stringify(err));
      });
    }).catch((err: BusinessError) => {
      hilog.error(0x0000, 'Index', 'Promise getCurrentLocation err:' + JSON.stringify(err));
    })
  }
  // 位置权限----------end
  build() {
Column(){
  Button('位置权限').onClick((event: ClickEvent) => {
    this.checkPermissionGrant();
  })
  Button('相机权限').onClick(async ()=>{
    await this.requestCameraPermission();
  })
}
  }
}

                
### UniApp 中检测鸿蒙系统相机权限的方法 在 UniApp 开发环境中,针对鸿蒙系统的特定功能实现需要遵循其特有的权限管理机制。对于访问设备摄像头这一敏感操作,在调用前需确认已获得必要的权限。 #### 权限声明 为了能够在应用程序中正常使用相机功能,开发者应当先于 `config.json` 文件内适当位置加入如下所示的权限声明部分: ```json { "app": { ... }, "module": { "camera": { "permission": [ "ohos.permission.CAMERA" ] } } } ``` 此配置确保应用启动时会向操作系统请求获取相应的硬件资源控制权[^1]。 #### 动态权限检查与申请 考虑到不同版本的操作系统可能有不同的处理逻辑,建议采用动态的方式去验证当前是否有足够的权限来执行拍照动作。可以利用官方提供的 API 进行实时判断并引导用户完成授权流程: ```javascript // 检测是否拥有相机权限 function checkCameraPermission() { const permission = plus.android.importClass('ohos.app.Context').CAMERA; if (plus.os.name === 'HarmonyOS') { // 判断运行环境是否为鸿蒙系统 let result = plus.permissions.checkSelfPermissions([permission]); if(result !== 'GRANTED'){ console.log("未授予相机权限"); // 请求权限 plus.permissions.requestPermissions( [permission], function(success){ console.log("成功获取到相机权限", success); }, function(error){ console.error("获取相机权限失败", error.message); }); return false; }else{ console.log("已经具有相机权限"); return true; } } return null; // 非鸿蒙环境下不作特殊处理 } if(checkCameraPermission()){ // 执行打开相机的动作 this.$refs.gmyImgCropper.chooseImage1(); this.buttonType=0; }else{ alert('请前往设置页面开启本应用的相机权限'); } ``` 上述代码片段展示了如何通过编程手段查询是否存在有效的相机使用权,并且当缺少该权限时给出提示让用户同意授予权限给应用使用[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值