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

相关推荐
MediaTea2 分钟前
Ae 效果详解:VR 颜色渐变
前端·vr
九思x4 分钟前
Node.js和Vue CLI 安装指南(Windows 系统)
前端·vue.js·windows
你我哈9 分钟前
Vue.js 与 Axios 实现音乐自由
前端·javascript·vue.js
uhakadotcom28 分钟前
Next.js 高并发场景下的性能优化技巧
前端·面试·github
没资格抱怨32 分钟前
vue3中接收props的两种写法
前端·javascript·vue.js
初遇你时动了情37 分钟前
js防抖、节流函数封装
前端·javascript·vue.js
树上有只程序猿1 小时前
Linux系列:如何调试 malloc 的底层源码
前端
尚学教辅学习资料1 小时前
基于SSM+Vue的汽车维修保养预约系统+LW示例
前端·vue.js·汽车·java毕设·汽车维修
莓事哒1 小时前
Web网页制作(静态网页):千年之恋
前端·web