KaiOS 获取SIM卡MCCMNC等信息的代码实现

20 篇文章 0 订阅
18 篇文章 0 订阅

KaiOS 没有Android上的CarrierConfig运营商定制机制,通常要拿SIM卡信息进行判断定制。

以下是几种获取MCCMNC和GID的方法,基本通过 iccInfo 实现。

应用

B2G原生 mobileConnections  + iccManager

可以在应用模块中调用公开接口,如gaia/apps/system

  isOpSim() {
    let connection = navigator.b2g.mobileConnections;
    if (connection[0] && (connection[0].iccId)) {
      let iccInfo = navigator.b2g.iccManager.getIccById(connection[0].iccId).iccInfo;
      if(!iccInfo) { //卡信息空
        return false;
      }
      let mccmnc = iccInfo.mcc + iccInfo.mnc;
      if (mccmnc === '46001') { //运营商对应的MCCMNC判断
        //如果有GID需求可选取子串进行比较,因为SIM中可能有多位FF,完全匹配概率小而且不准确。
        let gid1 = iccInfo.gid1.substring(0, 2).toUpperCase();  
        dump('mccmnc = ' + mccmnc + ', gid1 = ' + gid1);
        if (gid == "A2" || gid == "F4") {
          return true;
        }
      }
    }
    return false;
  }

定制封装工具

用下节工具类的方法,在其内定义接口暴露给外部应用。

//operator_utils.js

//"u_"或许是util的标志前缀约定
  isOp: function u_isOp() {
    if (this.getMccMnc() && ("46001".indexOf(this.getMccMnc()) !== -1)) {
      dump("u_isOp: gid1 = " + this.getGid1());
      let gidUpper = this.getGid1().toUpperCase() + '';
      if(gidUpper.indexOf('A2') == 0 || gidUpper.indexOf('B4') == 0) {
        return true;
      }
    }
    return false;
  },

应用内:

        if (value !== null && value !== undefined && OperatorUtils.isOp()) {
          value  = "customeOpName";
          dump("updateUI: carrier = " + value);
        }

工具类 

在shared APP中暴露工具接口给外部使用,如 gaia/apps/shared/js/utils/operator_utils.js

'use strict';
const OperatorUtils = {

  //运营商常量
  CMCC_MVNO_MCC_MNC: ['46001'],

  simMccMnc: null,
  simGid1: null,
  simGgid2: null,
  buildOpName: null,
  simOperatorName: null,

  //初始化
  init: function t_init() {
    this.initBuildOpInfo(); //编译属性值
    this.initSimInfo(); //初始化以上MCCMNC+GID等变量值
  },


  //判断设备是否已插卡
  hasSim: function t_hasSim() {
    let iccManager = navigator.b2g.iccManager;
    if (!iccManager || !iccManager.iccIds) {
      return false;
    }
    return !(0 === iccManager.iccIds.length);
  },

  //软件版本编译属性值,ro.xxx可以是原生或者OEM定制的系统属性
  initBuildOpInfo: function t_initBuildOpInfo() {
    if (this.buildOpName === null
      && typeof navigator.b2g.engmodeManager !== 'undefined') {
      navigator.b2g.engmodeManager.getPropertyValue('ro.operator.name').then((buildName) => {
        dump("[OperatorUtils]initBuildOpInfo: buildOpName = " + buildName);
        this.buildOpName = buildName;
      });
    }
  },

  //初始化MCCMNC+GID
  initMccMnc: function t_initSimInfo() {
    if (this.simMccMnc) {
      dump("[OperatorUtil]initSimInfo: simMccMnc = " + this.simMccMnc);
      return;
    }

    let iccManager = navigator.b2g.iccManager;
    if (!iccManager || !iccManager.iccIds || iccManager.iccIds.length === 0) {
      dump("[OperatorUtil]initSimInfo: no SIM card detected");
      return;
    }

    let iccId = iccManager.iccIds[0];
    let iccObj = iccManager.getIccById(iccId);
    let iccInfo = iccObj ? iccObj.iccInfo : null;
    if (iccInfo === null) {
      dump("[OperatorUtil]initSimInfo: iccInfo is null");
      return;
    }

    let mcc = iccInfo.mcc;
    let mnc = iccInfo.mnc;
    this.simMccMnc = mcc + mnc;
    this.simGid1 = iccInfo.gid1;
    this.simGgid2 = iccInfo.gid2;
    dump("[OperatorUtil]initSimInfo: simMccMnc = " + this.simMccMnc
      + ", gid1 = " + this.simGid1 + ", gid2 = " + this.simGgid2);
  },


  //用于内部逻辑获取MCCMNC,GID实现同理,返回this.simGid1即可
  getMccMnc: function t_getMccMnc() {
    if (!this.simMccMnc && this.hasSim()) {
      this.initMccMnc();
    }
    return this.simMccMnc;
  },


}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值