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

相关推荐
90后的晨仔3 分钟前
在macOS上无缝整合:为Claude Code配置魔搭社区免费API完全指南
前端
沿着路走到底34 分钟前
JS事件循环
java·前端·javascript
子春一21 小时前
Flutter 2025 可访问性(Accessibility)工程体系:从合规达标到包容设计,打造人人可用的数字产品
前端·javascript·flutter
白兰地空瓶1 小时前
别再只会调 API 了!LangChain.js 才是前端 AI 工程化的真正起点
前端·langchain
jlspcsdn2 小时前
20251222项目练习
前端·javascript·html
行走的陀螺仪2 小时前
Sass 详细指南
前端·css·rust·sass
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
React 怎么区分导入的是组件还是函数,或者是对象
前端·react.js·前端框架
LYFlied3 小时前
【每日算法】LeetCode 136. 只出现一次的数字
前端·算法·leetcode·面试·职场和发展
子春一23 小时前
Flutter 2025 国际化与本地化工程体系:从多语言支持到文化适配,打造真正全球化的应用
前端·flutter
QT 小鲜肉3 小时前
【Linux命令大全】001.文件管理之file命令(实操篇)
linux·运维·前端·网络·chrome·笔记