蜂窝数据和wifi通道切换

蜂窝数据和wifi通道切换


import { BusinessError } from '@kit.BasicServicesKit';
import { connection } from '@kit.NetworkKit';
import { data } from '@kit.TelephonyKit';
import { ToastUtil } from '@pura/harmony-utils';
import { sim } from '@kit.TelephonyKit';

export class WifiConnectManager {
  private static instance?: WifiConnectManager;
  private isWifi: boolean = true;

  /**
   * Get singleton
   *
   * @returns Singleton object
   */
  public static getInstance(): WifiConnectManager {
    if (!WifiConnectManager.instance) {
      WifiConnectManager.instance = new WifiConnectManager();
    }
    return WifiConnectManager.instance;
  }

  /**
   * @description :移动数据是否开启
   */
  public async isMobileDataEnabled(): Promise<boolean> {
    return await data.isCellularDataEnabled() && this.isSimCardInserted();
  }

  /**
   * @description :SIM 1、2卡槽是否插卡
   */
  public isSimCardInserted(): boolean {
    // 1、获取卡槽数量
    const maxSimCount = sim.getMaxSimCount()
    console.info(' Sim Count:', maxSimCount);

    // 2、遍历所有卡槽,检查是否有 SIM 卡
    for (let i = 0; i < maxSimCount; i++) {
      try {
        const hasCard = sim.hasSimCardSync(i);
        if (hasCard) {
          console.info(`SIM card detected in slot ${i}`);
          return true;
        }
      } catch (error) {
        console.error(`Failed to check SIM card in slot ${i}: ${JSON.stringify(error)}`);
      }
    }

    // 3、所有卡槽都没有卡
    console.info('No SIM card detected in any slot');
    return false;
  }


  /**
   * @param: isWifi: true: wifi, false: 流量
   */
  public startListenNetChange(isWifi: boolean): void {
    console.info('registerNetListener');
    console.info('registerNetListener', `connect  type : + ${isWifi ? 'wifi' : '流量'}`);
    WifiConnectManager.getInstance().isWifi = isWifi;
    let netConnectionWifi = connection.createNetConnection({
      netCapabilities: {
        bearerTypes: [connection.NetBearType.BEARER_WIFI]
      }
    });

    netConnectionWifi.register((error: BusinessError) => {
      if (error) {
        console.error(`register error: ${error.code}`);
      }
    });
    netConnectionWifi.on('netAvailable', () => {
      console.info('netConnectionWifi netAvailable');
      if (WifiConnectManager.getInstance().isWifi) {
        this.bindWifiWhenConnected();
      } else {
        this.bindCellularWhenConnected();
      }
    });
    netConnectionWifi.on('netLost', () => {
      console.info('Wifi netLost');
      if (WifiConnectManager.getInstance().isWifi) {
        this.bindWifiWhenConnected();
      } else {
        this.bindCellularWhenConnected();
      }
    });
    let netConnectionCellular = connection.createNetConnection({
      netCapabilities: {
        bearerTypes: [connection.NetBearType.BEARER_CELLULAR]
      }
    });
    netConnectionCellular.register((error: BusinessError) => {
      if (error) {
        console.error(`register error: ${error.message}`);
      }
    });
    netConnectionCellular.on('netAvailable', () => {
      console.info('netConnectionCellular netAvailable');
      if (WifiConnectManager.getInstance().isWifi) {
        this.bindWifiWhenConnected();
      } else {
        this.bindCellularWhenConnected();
      }
    });
    netConnectionCellular.on('netLost', () => {
      console.info('Cellular netLost');
      if (WifiConnectManager.getInstance().isWifi) {
        this.bindWifiWhenConnected();
      } else {
        this.bindCellularWhenConnected();
      }
    });
  }

  /**
   * @Description: 绑定WiFi
   */
  private async bindWifiWhenConnected(): Promise<void> {
    await connection.setAppNet(connection.getDefaultNetSync()).then(() => {
      console.info('setAppNet default success');
    });

    connection.getAllNets().then((data: connection.NetHandle[]) => {
      data.forEach(net => {
        connection.getNetCapabilities(net).then((data: connection.NetCapabilities) => {
          if (data.bearerTypes.length > 0 && data.bearerTypes[0] === connection.NetBearType.BEARER_WIFI) {
            connection.setAppNet(net).then(() => {
              console.info('setAppNet wifi success');
              return;
            }).catch((error: Error) => {
              console.error(`setAppNet wifi failed, error = ${error.message}`);
            });
          }
        }).catch((error: Error) => {
          console.error(`getNetCapabilities error = ${error.message}`);
        });
      });
    }).catch((error: Error) => {
      console.error(`getAllNets error = ${error.message}`);
    });
  }

  /**
   * @Description: 绑定移动数据
   */
  private async bindCellularWhenConnected(): Promise<void> {
    // 先判断移动数据是否开启
    const isMobileDataEnabled = await this.isMobileDataEnabled()
    if (!isMobileDataEnabled) {
      ToastUtil.showToast($r('app.string.Telephony_error'));
      return
    }
    await connection.setAppNet(connection.getDefaultNetSync()).then(() => {
      console.info('setAppNet default success');
    });
    connection.getAllNets().then((data: connection.NetHandle[]) => {
      data.forEach(net => {
        connection.getNetCapabilities(net).then((data: connection.NetCapabilities) => {
          if (data.bearerTypes.length > 0 && data.bearerTypes[0] === connection.NetBearType.BEARER_CELLULAR) {
            connection.setAppNet(net).then(() => {
              console.info('setAppNet cellular success');
              return;
            }).catch((error: Error) => {
              console.error(`setAppNet cellular failed, error = ${error.message}`);
            });
          }
        }).catch((error: Error) => {
          console.error(`getNetCapabilities error = ${error.message}`);
        });
      });
    }).catch((error: Error) => {
      console.error(`getAllNets error = ${error.message}`);
    });
  }
}

posted @ 2026-06-16 20:02  带头大哥d小弟  阅读(7)  评论(0)    收藏  举报