申请权限、打开应用设置和选择图片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

相关推荐
牛奶22 分钟前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶24 分钟前
前端人为什么要学AI?
前端·人工智能·ai编程
Kagol3 小时前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
GIS之路4 小时前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide4 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
ssshooter5 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸5 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
Live000006 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉6 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化