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

  • 效果:

  • 完整工具类:

javascript 复制代码
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()
    }
  }
}
  • 使用
javascript 复制代码
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 })
  }
}
相关推荐
dawn6 小时前
鸿蒙ArkTS中的获取网络数据
华为·harmonyos
桃花键神6 小时前
鸿蒙5.0时代:原生鸿蒙应用市场引领开发者服务新篇章
华为·harmonyos
鸿蒙自习室6 小时前
鸿蒙多线程开发——并发模型对比(Actor与内存共享)
华为·harmonyos
JavaPub-rodert8 小时前
鸿蒙生态崛起:开发者的机遇与挑战
华为·harmonyos
帅比九日10 小时前
【HarmonyOS Next】封装一个网络请求模块
前端·harmonyos
yilylong11 小时前
鸿蒙(Harmony)实现滑块验证码
华为·harmonyos·鸿蒙
baby_hua11 小时前
HarmonyOS第一课——DevEco Studio的使用
华为·harmonyos
HarmonyOS_SDK12 小时前
融合虚拟与现实,AR Engine为用户提供沉浸式交互体验
harmonyos
- 羊羊不超越 -13 小时前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
长弓三石15 小时前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙