申请权限、打开应用设置和选择图片Picker

需要权限 运行时权限 包括地理位置、相机、麦克风、文件、图片视频、日历、健身运动、身体传感器、音乐、等权限

  • 数据包括个人数据(如照片、通讯录、日历、位置等)、设备数据(如设备标识、相机、麦克风等)。
  • 功能包括设备功能(如访问摄像头/麦克风、打电话、联网等)、应用功能(如弹出悬浮窗、创建快捷方式等)

授权方式

具体权限在

根据授权方式的不同,权限类型可分为system_grant(系统授权)和user_grant(用户授权) 和 受限权限。

  • system_grant(系统授权)如果在应用中申请了system_grant权限,那么系统会在用户安装应用时,自动把相应权限授予给应用,比如 ohos.permission.INTERNET 上网
  • user_grant指的是用户授权类型, 需要用户运行时申请,
  • 受限权限,需要在huawei申请。应用需要克隆、备份或同步图片/视频类文件。比如 READ_IMAGEVIDEO

声明

应用需要在module.json5配置文件的requestPermissions标签中声明权限

module 下面

  • name 就是所需要的权限 地理位置、相机、麦克风、文件、图片视频 等等
  • reason 当申请的权限为user_grant权限时此字段必填,用于描述申请权限的原因。会在弹出授权框时出现
  • usedScene,abilities和when组成。其中abilities可以配置为多个UIAbility组件,when 表示调用时机。when:inuse(使用时)、always(始终),abilities 不配置也没事
ts 复制代码
"requestPermissions": [
  {
    "name": 'ohos.permission.INTERNET'
  },
  {
    // 相机权限为用户权限,需要用户授权同意。所以要对权限使用的原因和场景进行描述。
    "name": "ohos.permission.CAMERA",
    // reason 必须在string中
    "reason": "$string:Camera_reason",
    "usedScene": {
      "when": "always"
      "abilities": ["EntryAbility"]
    }
  }
]

检测是否有这个权限

使用 abilityAccessCtrl.AtManager 类来检测,需要tokenid,不知道为啥没成功

ts 复制代码
try {
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_METADATA;

  let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
  let bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleFlags)
  let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
  // 获取应用的唯一表示,相当于是那个应用向应用申请检测的
  let tokenId = appInfo.accessTokenId
  let status: abilityAccessCtrl.GrantStatus = atManager.checkAccessTokenSync(tokenId, 'ohos.permission.CAMERA')
  if (status = abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
    promptAction.showToast({ message: '已经获取了' })
  } else {
    promptAction.showToast({ message: '未获取,需要申请' })
  }
} catch (e) {
  console.error('错误了')
}

请求权限

使用abilityAccessCtrl.AtManager,里面还有这次是否弹窗

ts 复制代码
let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(getContext(this), ['ohos.permission.CAMERA']).then((data) => {
  let grantStatus: Array<number> = data.authResults;
  if (grantStatus[0] === 0) {
    // 授权成功
    promptAction.showToast({ message: '授权成功' })
  } else {

  }

}).catch((err: Error) => {
})

去设置页打开权限

这里面pushParams 就是自己这是你自己的bundleName

ts 复制代码
AlertDialog.show({
  title: "权限申请",
  message: '去设置页面打开',
  primaryButton: {
    value: '取消', action: () => {
      promptAction.showToast({ message: '取消了' })
    }
  },
  secondaryButton: {
    value: '确定', action: () => {
      let wantInfo: Want = {
        bundleName: 'com.huawei.hmos.settings',
        abilityName: 'com.huawei.hmos.settings.MainAbility',
        uri: 'application_info_entry',
        parameters: {
          pushParams: 'com.nzy.test' // 打开指定应用的详情页面 这是你自己的bundleName
        }
      }
      let context = getContext(this) as common.UIAbilityContext
      context.startAbility(wantInfo)
    }
  }
})

选择图片

用户有时需要分享图片、视频等用户文件 可以使用 PhotoViewPicker,不需要使用权限就可以拿到了,这样拿到只读,可以选择图片或者视频,或者视频加图片,可以拿到 注意不能在picker的回调里直接使用此uri进行打开文件操作,需要定义一个全局变量保存uri

ts 复制代码
@State src: PixelMap | ResourceStr | DrawableDescriptor = '';
let context = getContext(this) as common.UIAbilityContext; // 请确保 getContext(this) 返回结果为 UIAbilityContext
let photoPicker = new picker.PhotoViewPicker(context);
photoPicker.select({ MIMEType: picker.PhotoViewMIMETypes.IMAGE_TYPE },
  (error, result: picker.PhotoSelectResult) => {
    if (!error) {
      this.message = ` ${JSON.stringify(result)}`
      console.log(`result = > ${result}`)
      this.photoUris = result.photoUris
      if(this.photoUris.length>0){
        // 线上到图片上
        this.src = result.photoUris[0]
        this.setResult()
      }
    }
  })

通过使用fileIo.openSync接口,通过uri打开这个文件得到fd

ts 复制代码
async setResult() {
  let uri: string = this.photoUris[0];
  let file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);
  console.info('file fd: ' + file.fd);
  let buffer = new ArrayBuffer(114096);
  let readLen = fileIo.readSync(file.fd, buffer);
  console.info('readSync data to file succeed and buffer size is:' + readLen);
  fileIo.closeSync(file);
}

指定URI获取图片或视频资源

需要这个了,就不考虑了 ohos.permission.READ_IMAGEVIDEO

相关推荐
jacGJ15 小时前
记录学习--文件读写
java·前端·学习
毕设源码-赖学姐15 小时前
【开题答辩全过程】以 基于WEB的实验室开放式管理系统的设计与实现为例,包含答辩的问题和答案
前端
幻云201015 小时前
Python深度学习:从筑基到登仙
前端·javascript·vue.js·人工智能·python
我即将远走丶或许也能高飞17 小时前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
钟离墨笺18 小时前
Go语言--2go基础-->基本数据类型
开发语言·前端·后端·golang
爱吃泡芙的小白白18 小时前
Vue 3 核心原理与实战:从响应式到企业级应用
前端·javascript·vue.js
卓怡学长18 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
老陈聊架构19 小时前
『AI辅助Skill』掌握三大AI设计Skill:前端独立完成产品设计全流程
前端·人工智能·claude·skill
Ulyanov19 小时前
从桌面到云端:构建Web三维战场指挥系统
开发语言·前端·python·tkinter·pyvista·gui开发
cypking19 小时前
二、前端Java后端对比指南
java·开发语言·前端