HarmonyOS ArkUi 唤起系统APP:指定设置界面、浏览器、相机、拨号界面、选择通讯录联系人

news2024/11/22 16:35:57
  • 效果:
    在这里插入图片描述

  • 完整工具类:

import { common, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { call } from '@kit.TelephonyKit';
import { promptAction } from '@kit.ArkUI';
import { contact } from '@kit.ContactsKit';
import { camera, cameraPicker } from '@kit.CameraKit';

export class SystemAppUtil {
  static tag: string = 'SystemAppUtil  '

  /**
 * 唤起系统浏览器应用
 * */
  static openBrowsable(url: string) {
    if (!url) {
      promptAction.showToast({ message: "唤起系统浏览器失败,url为空!" })
      return
    }
    if (getContext()) {
      let context = getContext() as common.UIAbilityContext;
      let want: Want = {
        action: 'ohos.want.action.viewData',
        entities: ['entity.system.browsable'],
        uri: url
      };
      context.startAbility(want)
        .then(() => {
          console.info(SystemAppUtil.tag + ' 拉起浏览器成功');
        })
        .catch((err: BusinessError) => {
          console.error(SystemAppUtil.tag + ` 拉起浏览器失败: Code: ${err.code}, message: ${err.message}`);
        });
    } else {
      promptAction.showToast({ message: "唤起系统浏览器失败,context为空!" })
    }
  }

  /**
 * 唤起系统拨号界面
 * */
  static startCall(phoneNumber: string): void {
    if (!phoneNumber) {
      promptAction.showToast({ message: "唤起系统拨号界面失败,手机号码为空!" })
      return
    }
    // 检测是否支持语音通话
    let isSupport = call.hasVoiceCapability();
    if (!isSupport) {
      console.error(SystemAppUtil.tag + '不支持语音通话');
      return;
    }

    call.makeCall(phoneNumber, (err: BusinessError) => {
      if (err) {
        console.error(SystemAppUtil.tag + `唤起拨号界面失败. Code is ${err.code}, Message is ${err.message}`);
        return;
      }
      console.info(SystemAppUtil.tag + '唤起拨号界面成功');
    })
  }


  /**
 * 通讯录:打开通讯录并选择联系人,通过 promise回调
 * @param isMultiSelect 选择联系人,是否允许多选  true:支持多选
 * */
  static async selectContacts(isMultiSelect: boolean = false): Promise<Array<contact.Contact>> {
    let promise = await contact.selectContacts({ isMultiSelect: isMultiSelect });
    return promise
  }


  /**
 * 打开指定设置界面:对应界面关系
 *  * wifi_entry : HOME-WLAN
 * bluetooth_entry : HOME-蓝牙
 * mobile_network_entry: HOME-移动网络
 * hotspot_data_settings: HOME-移动网络-个人热点界面
 * password_entry: HOME-移动网络-个人热点-密码界面
 * connected_device_entry: HOME-移动网络-个人热点-已连接设备界面
 * more_share_entry: HOME-移动网络-个人热点-更多共享设置界面
 * more_connections_settings: HOME-更多连接
 * nfc_settings: HOME-更多连接-NFC三级页面
 * display_settings: HOME-显示和亮度
 * screen_zoom: HOME-显示和亮度-显示大小三级页面
 * screen_refresh_rate_entry: HOME-显示和亮度-屏幕刷新率三级页面  (需看具体设备是否有刷新率选项)
 * volume_settings: HOME-声音和振动
 * systemui_notification_settings: HOME-通知和状态栏
 * accessibility_feature: accessibility_feature
 * accessibility_operation_entry: HOME-辅助功能-辅助功能快捷键三级页面
 * accessibility_more_settings_entry: HOME-辅助功能-已安装的服务-服务详情-更多设置五级页面
 * application_and_service_settings: HOME-应用与元服务
 * application_settings: HOME-应用与服务-应用管理三级页面
 * application_info_entry: HOME-应用和元服务HOME-某个具体应用的应用信息,需传递want.parameters.pushParams为具体应用的包名
 * storage_settings: HOME-存储界面
 * battery: HOME-电池
 * biometrics_and_password_settings: HOME-生物识别和密码
 * lock_screen_password_title: HOME-生物识别和密码-设置数字锁屏密码
 * change_six_to_number_entry: HOME-生物识别和密码-锁屏密码(其他密码类型)-自定义数字密码(设置锁屏数字密码)四级页面
 * hange_six_to_mixed_entry: HOME-生物识别和密码-锁屏密码(其他密码类型)-混合密码(设置锁屏密码)四级页面
 * fingerprint_settings_entry: HOME-生物识别与密码-指纹3级页面  (需看具体设备是否支持指纹解锁能力)
 * privacy_settings: HOME-隐私与安全
 * location_help_entry: HOME-隐私与安全-定位服务-帮助四级页面
 * users_accounts: HOME-用户和账户
 * current_user: HOME-用户和账户-当前登录(用户)三级页面
 * system_and_updates: HOME-系统和更新
 * time_zone_settings: HOME-系统和更新-日期时间-时区-时区选择列表
 * date_and_time: HOME-系统和更新-日期时间三级页面
 * set_language: HOME-系统和更新-语言和输入法-语言和输入法四级页面
 * set_language_region: HOME-系统和更新-语言和输入法-语言和地区-语言和地区5级页面
 * reset_settings: HOME-系统和更新-重置三级页面
 * developer_options_settings: HOME-系统和更新-开发人员选项三级页面
 * edit_language_entry: HOME-系统和更新-语言和输入法-语言和地区-编辑(编译语言)五级页面
 * add_language_entry: HOME-系统和更新-语言和输入法-语言和地区-添加语言五级页面
 * select_region_entry: HOME-系统和更新-语言和输入法-语言和地区-当前地区(选择地区)五级页面
 * reset_factory_settings: HOME-系统和更新-重置-恢复出厂设置四级页面
 * reset_net_settings: HOME-系统和更新-重置-还原网络设置四级页面
 * reset_confirm_settings: HOME-系统和更新-重置-恢复出厂设置-重置手机五级页面
 * reset_net_confirm_settings: HOME-系统和更新-重置-还原网络设置-还原网络设置确认五级页面
 * about_device: HOME-关于本机界面
 * device_name: HOME-HOME-关于本机-设备名称
 *  * */
  static openDesignateSetting(uri: string) {
    if (getContext()) {
      let ctx = getContext() as common.UIAbilityContext;
      let applicationInfo = ctx.getApplicationContext().applicationInfo
      ctx.startAbility({
        bundleName: 'com.huawei.hmos.settings',
        abilityName: 'com.huawei.hmos.settings.MainAbility',
        uri: uri,
        parameters: {
          pushParams: applicationInfo.name // 包名
        }
      });
    } else {
      promptAction.showToast({ message: "唤起打开指定设置界面失败,context为空!" })
    }
  }

  /**
 * 打开在华为市场的应用详情
 * */
  static openAppGalleryDetailAbility(bundleName: string): void {
    if (getContext()) {
      let ctx = getContext() as common.UIAbilityContext;
      let want: Want = {
        action: 'ohos.want.action.appdetail',
        uri: 'store://appgallery.huawei.com/app/detail?id=' + bundleName, // bundleName为需要打开应用详情的应用的包名
      };
      ctx.startAbility(want).then(() => {
        console.info(SystemAppUtil.tag + ' 打开应用市场成功');
      }).catch((err: BusinessError) => {
        console.error(SystemAppUtil.tag + `打开应用市场失败. Code: ${err.code}, message: ${err.message}`);
      });
    } else {
      promptAction.showToast({ message: "打开在华为市场的应用详情,context为空!" })
    }
  }

  /**
 * 打开相机
 * */
  static async startCameraPicker(): Promise<cameraPicker.PickerResult> {
    if (getContext()) {
      let ctx = getContext() as common.UIAbilityContext;
      try {
        let pickerProfile: cameraPicker.PickerProfile = {
          cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK
        };
        // PickerMediaType 配置打开类型
        let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(
          ctx,
          [cameraPicker.PickerMediaType.PHOTO, cameraPicker.PickerMediaType.VIDEO],
          pickerProfile
        );
        return pickerResult
      } catch (error) {
        let err = error as BusinessError;
        console.error(SystemAppUtil.tag + `相机打开失败. error code: ${err.code}`);
        return new cameraPicker.PickerResult()
      }
    } else {
      promptAction.showToast({ message: "打开相机,context为空!" })
      return new cameraPicker.PickerResult()
    }
  }
}
  • 使用
import { SystemAppUtil } from '../../util/SystemAppUtil'
import { common } from '@kit.AbilityKit'
import { BusinessError } from '@kit.BasicServicesKit'

@Entry
@Component
export struct SystemAppUtilTestWidget {
  aboutToAppear() {
  }

  @State contacts: string = '选择联系人数据'
  @State pick: string = ' 拍照/录像结果'

  build() {
    Column() {
      Button('唤起系统浏览器').onClick(() => {
        let url = 'https://developer.huawei.com/consumer/cn/activity/'
        SystemAppUtil.openBrowsable(url)
      })

      Button('唤起拨号界面').onClick(() => {
        SystemAppUtil.startCall('13711111111')
      }).margin({ top: 15 })

      Button('打开通讯录选择联系人').onClick(() => {
        SystemAppUtil.selectContacts().then((data) => {
          this.contacts = JSON.stringify(data)
          console.log(`selectContacts success: data->${JSON.stringify(data)}`);
        }).catch((err: BusinessError) => {
          this.contacts = JSON.stringify(err)
          console.error(`selectContacts fail: err->${JSON.stringify(err)}`);
        });
      }).margin({ top: 15 })
      Text(this.contacts)

      Button('权限指定设置界面').onClick(() => {
        SystemAppUtil.openDesignateSetting('bluetooth_entry')
      }).margin({ top: 15 })

      Button('打开应用市场').onClick(() => {
      // 替换上架app的包名
        	SystemAppUtil.openAppGalleryDetailAbility('app的包名')
      }).margin({ top: 15 })

      Button('打开相机').onClick(() => {
        SystemAppUtil.startCameraPicker().then((data) => {
          console.log(`startCameraPicker success: data->${JSON.stringify(data)}`);
          this.pick = JSON.stringify(data)
        })
      }).margin({ top: 15 })
      Text(`拍照结果:${this.pick}`)

    }.height('100%').padding({ top: 70 })
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1936283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP宠物店萌宠小程序系统源码

&#x1f43e;萌宠生活新方式&#x1f43e; &#x1f3e1;【一键直达萌宠世界】 你是否也梦想着拥有一家随时能“云撸猫”、“云吸狗”的神奇小店&#xff1f;现在&#xff0c;“宠物店萌宠小程序”就是你的秘密花园&#xff01;&#x1f31f;只需轻轻一点&#xff0c;就能瞬…

使用Velero备份与恢复K8s集群及应用

作者&#xff1a;红米 环境 3台虚拟机组成一主两从的测试集群&#xff0c;使用NFS作为动态存储。 主机IP系统k8s-master192.168.1.10centos7.9k8s-node1192.168.1.11centos7.9k8s-node2192.168.1.12centos7.9 1、介绍 1.1 简介 备份容灾 一键恢复 集群迁移 支持备份pv&…

CH04_依赖项属性

第4章&#xff1a;依赖项属性 本章目标 理解依赖项属性理解属性验证 依赖项属性 ​ 属性与事件是.NET抽象模型的核心部分。WPF使用了更高级的依赖项属性&#xff08;Dependency Property&#xff09;功能来替换原来.NET的属性&#xff0c;实现了更高效率的保存机制&#xf…

卷积神经网络【CNN】--池化层的原理详细解读

池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;中的一个关键组件&#xff0c;主要用于减少特征图&#xff08;feature maps&#xff09;的维度&#xff0c;同时保留重要的特征信息。 一、池化层的含义 池化层在卷积神经网络中扮演着降…

python调用chrome浏览器自动化如何选择元素

功能描述&#xff1a;在对话框输入文字&#xff0c;并发送。 注意&#xff1a; # 定位到多行文本输入框并输入内容。在selenium 4版本中&#xff0c;元素定位需要填写父元素和子元素名。 textarea driver.find_element(By.CSS_SELECTOR,textarea.el-textarea__inner) from …

ACM中国图灵大会专题 | 图灵奖得主Manuel Blum教授与仓颉团队交流 | 华为论坛:面向全场景应用编程语言精彩回顾

ACM 中国图灵大会&#xff08;ACM Turing Award Celebration Conference TURC 2024&#xff09;于2024年7月5日至7日在长沙举行。本届大会由ACM主办&#xff0c;in cooperation with CCF&#xff0c;互联网之父Vinton Cerf、中国计算机学会前理事长梅宏院士和廖湘科院士担任学术…

linux进程——状态——linux与一般操作系统的状态

前言&#xff1a;博主在之前的文章已经讲解了PCB里面的pid——主要讲解了父子进程PID&#xff0c; 以及fork的相关内容。 本节进入PCB的下一个成员——状态&#xff0c; 状态是用来表示一个进程在内存中的状态的&#xff0c; 进程在内存中肯能处于各种状态&#xff0c; 比如运行…

十七、【机器学习】【非监督学习】- K-均值 (K-Means)

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

前端Vue组件化实践:自定义发送短信验证码弹框组件

在前端开发中&#xff0c;随着业务逻辑的日益复杂和交互需求的不断增长&#xff0c;传统的整体式开发方式逐渐暴露出效率低下、维护困难等问题。为了解决这些问题&#xff0c;组件化开发成为了一种流行的解决方案。通过组件化&#xff0c;我们可以将复杂的系统拆分成多个独立的…

使用 OpenCV 和 YOLO 模型进行实时目标检测并在视频流中显示检测结果

文章目录 Github官网简介视频帧推理视频设备ID安装依赖 检测示例分类示例姿势估计 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttps://docs.ultralytics.com/zh/quickstart/ 简介 Ultralytics 是一个软件公司&#xff0c;专…

深入浅出WebRTC—NACK

WebRTC 中的 NACK&#xff08;Negative Acknowledgment&#xff09;机制是实时通信中处理网络丢包的关键组件。网络丢包是常见的现象&#xff0c;尤其是在无线网络或不稳定连接中。NACK 机制旨在通过请求重传丢失的数据包来减少这种影响&#xff0c;从而保持通信的连续性和质量…

【VUE】v-if和v-for的优先级

v-if和v-for v-if 用来显示和隐藏元素 flag为true时&#xff0c;dom元素会被删除达到隐藏效果 <div class"boxIf" v-if"flag"></div>v-for用来进行遍历&#xff0c;可以遍历数字对象数组&#xff0c;会将整个元素遍历指定次数 <!-- 遍…

《数据结构:C语言实现双链表》

文章目录 一、链表的分类二、双向链表1、概念与结构 三、双向链表实现1、双向链表要实现的功能2、哨兵位初始化3、双链表头插数据4、判断链表是否为空5、打印链表数据6、尾插数据7、头删数据8、尾删数据9、寻找数据所在结点10、在任意结点之后插入数据11、删除任意结点12、销毁…

debian 更新源

前言 实现一键替换在线源 一键更新源 Debian 全球镜像站以下支持现有debian 11 12 echo "Delete the default source" rm -rf /etc/apt/sources.listecho "Build a new source" cat <<EOF>>/etc/apt/sources.list.d/debian.sources Types:…

Shell的正确使用

目录 shell 介绍 变量名的定义规则 变量名定义&#xff1a; 删除变量 特殊的变量名&#xff1a; 算术运算符 逻辑运算符&#xff1a; (1)整数之间比较 (2)按照文件权限进行判断 (3)按照文件类型判断 (4)多条件判断 常用的特殊字符&#xff1a; 条件选择、判断 if判…

PHP上门按摩专业版防东郊到家系统源码小程序

&#x1f486;‍♀️【尊享级体验】上门按摩专业版&#xff0c;告别东郊到家&#xff0c;解锁全新放松秘籍&#xff01;&#x1f3e0;✨ &#x1f525;【开篇安利&#xff0c;告别传统束缚】&#x1f525; 亲们&#xff0c;是不是厌倦了忙碌生活中的疲惫感&#xff1f;想要享…

NET 语言识别,语音控制操作、语音播报

System.Speech. 》》System.Speech.Synthesis; 语音播报 》》System.Speech.Recognition 语音识别 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Speech.Recog…

[Redis]典型应用——分布式锁

什么是分布式锁&#xff1f; 在一个分布式系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况。此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于"线程安全"的问题 举个例子&#xff0c;在平时抢票时&#xff0c;多个用户可能会同时买票&#…

Linux——多路复用之poll

目录 前言 一、poll的认识 二、poll的接口 三、poll的使用 前言 前面我们学习了多路复用的select&#xff0c;知道多路复用的原理与select的使用方法&#xff0c;但是select也有许多缺点&#xff0c;导致他的效率不算高。今天我们来学习poll的使用&#xff0c;看看poll较于…

利用AI与数据分析优化招聘决策

一、引言 在竞争激烈的职场环境中&#xff0c;招聘是组织获取人才、实现战略目标的关键环节。然而&#xff0c;传统的招聘方式往往依赖人力资源部门的主观经验和直觉&#xff0c;难以准确预测招聘效果&#xff0c;评估招聘渠道的效率。随着人工智能&#xff08;AI&#xff09;…