桃夭,一个轻量级的鸿蒙系统权限请求框架

简介 桃夭是鸿蒙系统上的一个权限请求框架,封装了权限请求逻辑,采用链式调用的方式请求权限,极大的简化了权限请求的代码。

简介

桃夭是鸿蒙系统上的一个权限请求框架,封装了权限请求逻辑,采用链式调用的方式请求权限,极大的简化了权限请求的代码。

申请权限的一般步骤

  • 判断是否有权限,如果有权限,直接进行下一步。

  • 如果没有权限,则开始申请权限。

  • 如果用户授权,进行下一步。

  • 如果用户拒绝授权,后面再次申请权限,系统为了不打扰用户,将不会出现系统的权限弹窗。在用户拒绝授权后,需要弹窗提示用户必须授权才能访问当前功能,并引导用户到系统设置中打开相应的权限。

    每次申请权限的时候,都需要经过以上几个步骤,当申请的权限越来越多,大量的重复代码就出现了。为了减少重复代码,我封装了一个权限请求框架。


权限请求框架

桃夭是鸿蒙系统上的一款权限请求框架,封装了权限请求逻辑,采用链式调用的方式请求权限,极大的简化了权限请求的代码,同时支持在UIUIAbilityUIExtensionAbility里面申请权限。需要注意的是,应用在UIExtensionAbility申请授权时,需要在onWindowStageCreate函数执行结束后或在onWindowStageCreate函数回调中申请权限。

本项目基于开源鸿蒙5.0开发,最低兼容到API 12,请将DevEco Studio升级到最新版。

桃夭名称来源

桃夭一词出自古代第一部诗歌总集《诗经》中《诗经·桃夭》,“桃之夭夭,灼灼其华。”桃花怒放千万朵,色彩鲜艳红似火。

下载安装

ohpm install @shijing/taoyao

申请运行时权限

TaoYao.with(this)
      .runtime()
      // 要申请的权限
      .permission(permissions)
      .onGranted(() => {
        // 权限申请成功
      })
      .onDenied(() => {
        // 权限申请失败
      })
      .request()

申请权限变得如此之简单。

已废弃的两个权限

允许应用读取用户外部存储中的媒体文件信息

ohos.permission.READ_MEDIA

允许应用读写用户外部存储中的媒体文件信息

ohos.permission.WRITE_MEDIA

从5.0,API 12开始,上述两个权限已经废弃。推荐方案(无需申请权限):使用图片/视频选择器读取媒体库的图片与视频;使用保存控件保存媒体库的图片与视频。

在api 12之前,只能跳转到系统权限设置页面。从API 12开始,可以直接拉起权限设置弹框,引导用户授予权限。这样的好处是,当系统设置权限弹窗关闭后,可以直接知道是否有权限。 默认情况下,桃夭会拉起系统权限设置弹窗,当系统权限设置弹窗关闭后,会通过回调告知是否有权限。
但是,有可能拉起系统权限设置弹窗会失败,目前发现ohos.permission.READ_HEALTH_DATA读取健康数据权限无法直接拉起系统设置弹窗,只能跳转到系统设置页面。 当拉起系统权限设置弹窗失败后,会回调onFailed。当回调回调onFailed,如果还是想从系统设置页面回来后是否有权限,可以在onPageShow方法里面申请权限。

  TaoYao
    .showSystemPermissionDialog(this.context, this.permissions)
    .onGranted(() => {
      // 直接拉起系统权限设置弹窗后,用户授权
      this.toast('直接拉起系统权限设置弹窗后,有权限了')
    })
    .onDenied(() => {
      // 直接拉起系统权限设置弹窗后,用户未授权
      this.toast('直接拉起系统权限设置弹窗后,没权限')
    })
    .onFailed(() => {
      /*
       * 拉起系统设置弹窗失败,无法直接判断用户是否在系统权限设置弹窗授权,
       * 只能跳转到系统权限设置页面,可以在onPageShow方法里面申请权限。
       * 目前发现ohos.permission.READ_HEALTH_DATA健康数据权限无法直接拉起系统设置弹窗,只能跳转到系统设置页面。
       */
       console.log("拉起系统设置弹窗失败,无法直接判断用户是否在系统权限设置弹窗授权,只能跳转到系统设置页面")
    })

申请通知权限

如果用户拒绝通知权限,只能跳转到系统设置页面,系统权限设置弹窗不支持通知权限

TaoYao.with(this.context)
      .notification()
      .permission()
      .onGranted(() => {
        // 通知权限申请成功
        this.toast()
      })
      .onDenied(() => {
        // 通知权限只能跳转到系统设置页面,系统权限设置弹窗不支持通知权限
        TaoYao.goToSettingPage(this.context)
      })
      .request()

判断是否有权限

有的时候仅仅只需判断是否有运行时权限,并不申请权限。

  /**
   * 仅仅检测是否有权限,如果没有权限,不会申请权限
   *
   * @param permissions
   * @returns true 有权限
   */
  static hasPermission(permissions: Array<Permissions>): boolean {
    const generalChecker = new GeneralChecker()
    return generalChecker.hasPermission(permissions)
  }

判断是否有通知权限

判断是否有通知权限,如果没有通知权限,不会申请通知权限

  /**
   * 判断是否有通知权限,如果没有通知权限,不会申请通知权限
   *
   * @returns true支持,false不支持
   */
  static isNotificationEnabled(): Promise<boolean> {
    return NotificationPermissionChecker.isNotificationEnabled()
  }

判断是否支持分布式通知

  /**
   * 判断是否支持分布式通知
   *
   * @returns true支持,false不支持
   */
  static isDistributedEnabled(): Promise<boolean> {
    return NotificationPermissionChecker.isDistributedEnabled()
  }

系统选择器

系统选择器已经获取了对应权限的预授权,开发者使用系统选择器时,无需再次申请权限也可临时受限访问对应的资源。例如,当应用需要读取用户图片时,可通过使用照片选择器,在用户选择所需要的图片资源后,直接返回该图片资源,而不需要授予应用读取图片文件的权限。

联系人选择器

通过联系人选择器获取联系人,不需要申请通讯录权限。

TaoYao.with(this.context)
      .contact()
      .onSuccess((data) => {
        // 联系人列表
        if (data.length > 0) {
          // 联系人名称
          console.log("yunfei", data[0].name?.fullName)
          // 联系人号码
          console.log("yunfei", data[0]?.phoneNumbers?.[0]?.phoneNumber)
        }
      })
      .onError((err) => {
        console.log(err.message)
      })
      .selectContacts(new ContactBuilder()
        // 可以选择多个联系人
        .setMultiSelect(true))

相机选择器

拉起系统相机不需要申请相机权限。

TaoYao.with(this.context)
      .camera()
      .onSuccess((uri) => {
        // 拍照或者录像的文件沙箱路径
        console.log(uri)
      })
      .onError((err) => {
        console.log(err.stack)
      })
      .openSystemCamera(new CameraBuilder()
        // 后置相机,默认使用后摄
        .setCameraSelector(CameraSelector.CAMERA_POSITION_BACK)
        // 可以只要拍照,只要录像,默认拍照和录像都有
        .setUseCase([UseCase.PHOTO, UseCase.VIDEO])
        // 文件保存路径,可以不设置
        //.setSaveUri("")
        // 录制视频最大时长,可以不设置
        //.setVideoMaxDuration()
      )

图片、视频选择器

拉起系统图库不需要申请存储权限,只能获取选中的图片、视频

TaoYao.with(this.context)
      .media()
      .onSuccess((uris) => {
        uris.forEach((uri) => {
          console.log("yunfei", uri)
        })
      })
      .onError((err) => {
        console.log(err.stack)
      })
      .select(new MediaBuilder()
        // 选择媒体文件的最大数目
        .setMaxSelectNumber(10)
        // 可选择的媒体文件类型,图片类型、视频类型、图片和视频类型、动态照片类型
        .setMediaMineType(MediaMimeType.IMAGE_VIDEO_TYPE)
      )

文档选择器

拉起文档选择器不需要申请权限,只能获取选中的文档

TaoYao.with(this.context)
      .document()
      .onSuccess((uris) => {
        uris.forEach((uri) => {
          console.log("yunfei", uri)
        })
      })
      .onError((err) => {
        console.log(err.stack)
      })
      .select(new DocumentBuilder()
        // 选择媒体文件的最大数目
        .setMaxSelectNumber(10)
        // 指定选择的文件或者目录路径(可选)
        //.setDefaultFilePathUri("")
        // 选择是否对指定文件或目录授权,true为授权,当为true时,defaultFilePathUri为必选参数,拉起文管授权界面;false为非授权,拉起常规文管界面(可选)
        //.setAuthMode(false)
        // 选择文件的后缀类型['后缀类型描述|后缀类型'](可选) 若选择项存在多个后缀名,则每一个后缀名之间用英文逗号进行分隔(可选),后缀类型名不能超过100,选择所有文件:'所有文件(*.*)|.*';
        // 例如:['图片(.png, .jpg)|.png,.jpg', '文档|.txt', '视频|.mp4', '.pdf']
        .setFileSuffixFilters(['文档|.docx'])
      )

音频选择器

拉起音频选择器不需要申请权限,只能获取选中的音频

TaoYao.with(this.context)
      .audio()
      .onSuccess((uris) => {
        uris.forEach((uri) => {
          console.log("yunfei", uri)
        })
      })
      .onError((err) => {
        console.log(err.stack)
      })
      // 目前音频选择器不支持参数配置,默认可以选择所有类型的用户文件。
      .select(new AudioBuilder())


来源: 互联网
本文观点不代表码客-全球程序员交流社区立场,不承担法律责任,文章及观点也不构成任何投资意见。

赞 ()

相关推荐

  • 置顶 开发项目接单群,免费入群了

    无论你是Android、ios、java、php,或者你是产品经理、老板,都可以免费入群接单或者发布项目,全程不收取任何费用。

    2025年02月21日 15点27分
  • 鸿蒙Next-AttributeModifier结合@Styles和@Extend深度解析使用

    声明式语法引入了@Styles和@Extend两个装饰器,可以解决复用相同自定义样式的问题,但是存在以下受限场景:

    2025年03月03日 15点40分
  • ConstraintLayout之layout_constraintDimensionRatio属性详解

    layout_constraintDimensionRatio 是 ConstraintLayout 提供的一个强大功能,它可以让 View 按照固定的宽高比例自适应尺寸。使用这个属性,可以在 ConstraintLayout 中根据已知的宽度或高度,自动计算另一个维度,确保 View 保持特定的宽高比。

    2025年03月03日 15点39分
  • Android事件分发时,你浓眉大眼的onTouch()竟然没有执行?

    在开发需求时,有这么一个场景:Activity中有一个ViewGroup作为Parent,ViewGroup里面又有一个Webview作为Child。当一进入页面时,系统输入法自动弹起,而在点击Parent区域时,需要收起系统输入法。背景介绍完毕,当时的第一想法就是通过Parent设置setOnTouchListener,然后在onTouch()回调中来实现:

    2025年03月02日 15点10分
  • Android SDK封装与发布实战指南

    Android SDK封装与发布实战指南

    2025年03月02日 15点05分
  • 鸿蒙Next开发-添加水印以及点击穿透设置

    在鸿蒙Next中,为App全局添加水印可以通过以下方式实现,其中通过窗口添加水印是一种常见且高效的方式。以下是具体方案和实现细节:

    2025年02月26日 23点15分
  • 鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

    鸿蒙Next开发-普通函数和箭头函数 this指向的区别以及对UI刷新的影响

    2025年02月26日 23点14分
  • 深入探索ArkUI @Builder与@BuilderParam的进阶应用

    在ArkUI的组件化开发体系中,@Builder和@BuilderParam这对装饰器组合扮演着UI模块化的重要角色。二者的差异与配合体现了声明式UI的核心思想:

    2025年02月26日 23点12分
  • Deepseek推荐:Android 开发者需要掌握的系统知识大纲

    一、操作系统基础1. Linux 内核机制内容介绍 Android 基于 Linux 内核,核心机制包括进程管理、内存管理、文件系统、Binder 驱动等。

    2025年02月26日 23点09分
  • Android App 厂商角标适配

    本篇介绍一下笔者在维护IM应用时,设置App角标的相关经验。同时这里设置角标都是基于系统厂商的Launcher,没有适配三方的Launcher应用,因为我们统计下来发现近些年使用三方Launcher应用比较少了,大部分用户还是以系统Launcher为主。所在在我们的项目中,主要是适配各个厂商。

    2025年02月26日 23点07分
  • 鸿蒙Next-方法装饰器以及防抖方法注解实现

    以下是关于 鸿蒙Next(HarmonyOS NEXT)中 MethodDecorator 的详细介绍及使用指南,结合了多个技术来源的实践总结:

    2025年02月26日 22点58分
  • DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

    DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境,它提供了丰富的快捷键以提高开发效率,以下为你详细介绍不同操作场景下的常用快捷键:

    2025年02月26日 22点56分
  • Android | 利用ItemDecoration绘制RecyclerView分割线

    RecyclerView.ItemDecoration 是 Android 提供的一种扩展机制,用于为 RecyclerView 的每个子项(Item)添加装饰(Decoration)。它通常用于绘制分割线、边距、背景等,目的是增强 RecyclerView 的显示效果。

    2025年02月26日 22点52分
  • Android 布局优化:利用 ViewStub 和 Merge 提升性能

    提升界面渲染性能是一个至关重要的任务,尤其是在应用启动时,渲染界面需要快速且流畅。为了优化 UI 渲染速度,Android 提供了许多工具,其中 ViewStub 和 Merge 标签是非常有效的布局优化手段。通过合理使用这两者,可以延迟加载不必要的视图、减少布局的嵌套层级,从而加速应用的启动和运行。

    2025年02月26日 22点47分
  • 玩转 ImageView.ScaleType:图片的缩放与裁剪技巧

    ImageView 是最常用的控件之一,它用于展示各种类型的图片。为了能够根据需求调整图片的显示效果,Android 提供了 ImageView.ScaleType 枚举,它可以灵活地控制图片如何适应 ImageView 的尺寸。本文将探讨 ImageView.ScaleType 的不同选项、使用场景及其实现技巧。

    2025年02月26日 22点45分
  • Android加快你的编译速度

    工欲善其事,必先利其器。如果每次运行项目都要花费5-10分钟,那人的心态都要崩了。

    2025年02月25日 15点40分

发表回复

评论列表

点击查看更多

    联系我们

    在线咨询: QQ交谈

    微信:dxmcpjl

    邮件:1529097251#qq.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    微信