鸿蒙NEXT开发Want工具类(ArkTs)

发布于:2025-04-17 ⋅ 阅读:(63) ⋅ 点赞:(0)
import { AppUtil } from './AppUtil';
import { Want, wantConstant } from '@kit.AbilityKit';
import { PreviewUtil } from './PreviewUtil';
import { FileUtil } from './FileUtil';

/**
 * Want 工具类
 * 提供跳转系统设置、拉起应用、文件管理等功能。
 * author: CSDN-鸿蒙布道师
 * since: 2025/04/16
 */
export class WantUtil {
  // 定义常用 URI 常量
  static readonly URI_NOTIFICATION: string = "systemui_notification_settings"; // 通知设置页面
  static readonly URI_WIFI: string = "wifi_entry"; // WLAN 设置页面
  static readonly URI_BLUETOOTH: string = "bluetooth_entry"; // 蓝牙设置页面
  static readonly URI_NFC: string = "nfc_settings"; // NFC 设置页面
  static readonly URI_VOLUME: string = "volume_settings"; // 声音和振动
  static readonly URI_STORAGE: string = "storage_settings"; // 存储界面
  static readonly URI_BATTERY: string = "battery"; // 电池
  static readonly URI_NETWORK: string = "mobile_network_entry"; // 移动网络设置页面
  static readonly URI_HOTSPOT_DATA: string = "hotspot_data_settings"; // 个人热点界面
  static readonly URI_DISPLAY: string = "display_settings"; // 显示和亮度
  static readonly URI_APPLICATION_AND_SERVICE: string = "application_and_service_settings"; // 应用与元服务
  static readonly URI_PRIVACY: string = "privacy_settings"; // 隐私与安全
  static readonly URI_SYSTEM_AND_UPDATES: string = "system_and_updates"; // 系统和更新

  /**
   * 跳转系统设置页面
   * @param uri 目标页面的 URI(使用 WantUtil 的 URI 常量)
   * @returns Promise<void>
   */
  static async toSetting(uri?: string): Promise<void> {
    const context = AppUtil.getContext();
    if (!context) {
      throw new Error("Context is not available.");
    }

    const want: Want = {
      bundleName: 'com.huawei.hmos.settings', // 设置应用 bundleName
      abilityName: 'com.huawei.hmos.settings.MainAbility', // 设置应用 abilityName
      uri: uri,
      parameters: {
        bundleName: context.abilityInfo.bundleName, // 拉起方应用包名
      },
    };
    return context.startAbility(want);
  }

  /**
   * 跳转通知设置页面
   * @returns Promise<void>
   */
  static toNotificationSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_NOTIFICATION);
  }

  /**
   * 跳转 WLAN 设置页面
   * @returns Promise<void>
   */
  static toWifiSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_WIFI);
  }

  /**
   * 跳转蓝牙设置页面
   * @returns Promise<void>
   */
  static toBluetoothSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_BLUETOOTH);
  }

  /**
   * 跳转 NFC 设置页面
   * @returns Promise<void>
   */
  static toNfcSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_NFC);
  }

  /**
   * 跳转声音和振动设置页面
   * @returns Promise<void>
   */
  static toVolumeSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_VOLUME);
  }

  /**
   * 跳转存储设置页面
   * @returns Promise<void>
   */
  static toStorageSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_STORAGE);
  }

  /**
   * 跳转电池设置页面
   * @returns Promise<void>
   */
  static toBatterySetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_BATTERY);
  }

  /**
   * 拉起系统浏览器
   * @param url 要打开的 URL
   * @returns Promise<void>
   */
  static async toWebBrowser(url: string): Promise<void> {
    if (!url) {
      throw new Error("URL cannot be empty.");
    }
    const context = AppUtil.getContext();
    const want: Want = {
      action: 'ohos.want.action.viewData',
      entities: ['entity.system.browsable'],
      uri: url,
      parameters: {
        bundleName: context.abilityInfo.bundleName, // 拉起方应用包名
      },
    };
    return context.startAbility(want);
  }

  /**
   * 拉起应用市场对应的应用详情界面
   * @param bundleName 需要打开应用详情的应用的包名
   * @returns Promise<void>
   */
  static async toAppGalleryDetail(bundleName: string): Promise<void> {
    if (!bundleName) {
      throw new Error("Bundle name cannot be empty.");
    }
    const want: Want = {
      action: 'ohos.want.action.appdetail',
      uri: `store://appgallery.huawei.com/app/detail?id=${bundleName}`,
    };
    return AppUtil.getContext().startAbility(want);
  }

  /**
   * 拉起系统文件管理器
   * @returns Promise<void>
   */
  static async toFileManagement(): Promise<void> {
    const want: Want = {
      bundleName: 'com.huawei.hmos.filemanager',
      abilityName: 'MainAbility',
    };
    return AppUtil.getContext().startAbility(want);
  }

  /**
   * 拉起短信界面并指定联系人
   * @param telephone 联系人电话号码
   * @param contactsName 联系人姓名(可选)
   * @returns Promise<void>
   */
  static async startMMS(telephone: string, contactsName: string = ''): Promise<void> {
    if (!telephone) {
      throw new Error("Telephone number cannot be empty.");
    }
    const want: Want = {
      bundleName: 'com.ohos.mms',
      abilityName: 'com.ohos.mms.MainAbility',
      parameters: {
        contactObjects: JSON.stringify([{ telephone, contactsName }]),
        pageFlag: 'conversation',
      },
    };
    return AppUtil.getContext().startAbility(want);
  }

  /**
   * 调用三方软件打开文件
   * @param uri 文件的 URI
   * @param write 是否有写入权限,默认为 true
   * @returns Promise<void>
   */
  static async openFile(uri: string, write: boolean = true): Promise<void> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    const fileExtention = FileUtil.getFileExtention(uri);
    const mimeType = PreviewUtil.getMimeType(fileExtention);

    const want: Want = {
      flags: write
        ? (wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION)
        : wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
      action: 'ohos.want.action.sendData',
      uri: uri,
      type: mimeType,
    };
    return AppUtil.getContext().startAbility(want);
  }
}

代码如下:
import { AppUtil } from './AppUtil';
import { Want, wantConstant } from '@kit.AbilityKit';
import { PreviewUtil } from './PreviewUtil';
import { FileUtil } from './FileUtil';

/**
 * Want 工具类
 * 提供跳转系统设置、拉起应用、文件管理等功能。
 * author: CSDN-鸿蒙布道师
 * since: 2025/04/16
 */
export class WantUtil {
  // 定义常用 URI 常量
  static readonly URI_NOTIFICATION: string = "systemui_notification_settings"; // 通知设置页面
  static readonly URI_WIFI: string = "wifi_entry"; // WLAN 设置页面
  static readonly URI_BLUETOOTH: string = "bluetooth_entry"; // 蓝牙设置页面
  static readonly URI_NFC: string = "nfc_settings"; // NFC 设置页面
  static readonly URI_VOLUME: string = "volume_settings"; // 声音和振动
  static readonly URI_STORAGE: string = "storage_settings"; // 存储界面
  static readonly URI_BATTERY: string = "battery"; // 电池
  static readonly URI_NETWORK: string = "mobile_network_entry"; // 移动网络设置页面
  static readonly URI_HOTSPOT_DATA: string = "hotspot_data_settings"; // 个人热点界面
  static readonly URI_DISPLAY: string = "display_settings"; // 显示和亮度
  static readonly URI_APPLICATION_AND_SERVICE: string = "application_and_service_settings"; // 应用与元服务
  static readonly URI_PRIVACY: string = "privacy_settings"; // 隐私与安全
  static readonly URI_SYSTEM_AND_UPDATES: string = "system_and_updates"; // 系统和更新

  /**
   * 跳转系统设置页面
   * @param uri 目标页面的 URI(使用 WantUtil 的 URI 常量)
   * @returns Promise<void>
   */
  static async toSetting(uri?: string): Promise<void> {
    const context = AppUtil.getContext();
    if (!context) {
      throw new Error("Context is not available.");
    }

    const want: Want = {
      bundleName: 'com.huawei.hmos.settings', // 设置应用 bundleName
      abilityName: 'com.huawei.hmos.settings.MainAbility', // 设置应用 abilityName
      uri: uri,
      parameters: {
        bundleName: context.abilityInfo.bundleName, // 拉起方应用包名
      },
    };
    return context.startAbility(want);
  }

  /**
   * 跳转通知设置页面
   * @returns Promise<void>
   */
  static toNotificationSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_NOTIFICATION);
  }

  /**
   * 跳转 WLAN 设置页面
   * @returns Promise<void>
   */
  static toWifiSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_WIFI);
  }

  /**
   * 跳转蓝牙设置页面
   * @returns Promise<void>
   */
  static toBluetoothSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_BLUETOOTH);
  }

  /**
   * 跳转 NFC 设置页面
   * @returns Promise<void>
   */
  static toNfcSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_NFC);
  }

  /**
   * 跳转声音和振动设置页面
   * @returns Promise<void>
   */
  static toVolumeSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_VOLUME);
  }

  /**
   * 跳转存储设置页面
   * @returns Promise<void>
   */
  static toStorageSetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_STORAGE);
  }

  /**
   * 跳转电池设置页面
   * @returns Promise<void>
   */
  static toBatterySetting(): Promise<void> {
    return WantUtil.toSetting(WantUtil.URI_BATTERY);
  }

  /**
   * 拉起系统浏览器
   * @param url 要打开的 URL
   * @returns Promise<void>
   */
  static async toWebBrowser(url: string): Promise<void> {
    if (!url) {
      throw new Error("URL cannot be empty.");
    }
    const context = AppUtil.getContext();
    const want: Want = {
      action: 'ohos.want.action.viewData',
      entities: ['entity.system.browsable'],
      uri: url,
      parameters: {
        bundleName: context.abilityInfo.bundleName, // 拉起方应用包名
      },
    };
    return context.startAbility(want);
  }

  /**
   * 拉起应用市场对应的应用详情界面
   * @param bundleName 需要打开应用详情的应用的包名
   * @returns Promise<void>
   */
  static async toAppGalleryDetail(bundleName: string): Promise<void> {
    if (!bundleName) {
      throw new Error("Bundle name cannot be empty.");
    }
    const want: Want = {
      action: 'ohos.want.action.appdetail',
      uri: `store://appgallery.huawei.com/app/detail?id=${bundleName}`,
    };
    return AppUtil.getContext().startAbility(want);
  }

  /**
   * 拉起系统文件管理器
   * @returns Promise<void>
   */
  static async toFileManagement(): Promise<void> {
    const want: Want = {
      bundleName: 'com.huawei.hmos.filemanager',
      abilityName: 'MainAbility',
    };
    return AppUtil.getContext().startAbility(want);
  }

  /**
   * 拉起短信界面并指定联系人
   * @param telephone 联系人电话号码
   * @param contactsName 联系人姓名(可选)
   * @returns Promise<void>
   */
  static async startMMS(telephone: string, contactsName: string = ''): Promise<void> {
    if (!telephone) {
      throw new Error("Telephone number cannot be empty.");
    }
    const want: Want = {
      bundleName: 'com.ohos.mms',
      abilityName: 'com.ohos.mms.MainAbility',
      parameters: {
        contactObjects: JSON.stringify([{ telephone, contactsName }]),
        pageFlag: 'conversation',
      },
    };
    return AppUtil.getContext().startAbility(want);
  }

  /**
   * 调用三方软件打开文件
   * @param uri 文件的 URI
   * @param write 是否有写入权限,默认为 true
   * @returns Promise<void>
   */
  static async openFile(uri: string, write: boolean = true): Promise<void> {
    if (!uri) {
      throw new Error("URI cannot be empty.");
    }
    const fileExtention = FileUtil.getFileExtention(uri);
    const mimeType = PreviewUtil.getMimeType(fileExtention);

    const want: Want = {
      flags: write
        ? (wantConstant.Flags.FLAG_AUTH_WRITE_URI_PERMISSION | wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION)
        : wantConstant.Flags.FLAG_AUTH_READ_URI_PERMISSION,
      action: 'ohos.want.action.sendData',
      uri: uri,
      type: mimeType,
    };
    return AppUtil.getContext().startAbility(want);
  }
}


网站公告

今日签到

点亮在社区的每一天
去签到