Android 10 SIM

参考:

csubId、slotId、SubscriptionInfo和SubscriptionManager的解释及关系说明_slot id-CSDN博客

Android SubscriptionManager - 李晓刚的博客 | LXG Blog

Android中TelephonyManager类的方法实例分析 - phpStudy

SIM Info​​​​​​​

iccid:唯一标识符

subid或者PhoneId:subid的值从1开始,每插入一个新卡,subId的值就会加1。插入双卡后数据库中就会有subid值为1和2的两个数据条目,拔卡插卡交换卡槽后,数据库并不会增加新项,只有插入一张新的sim卡才会增加一条id为3的数据条目。也就是一张卡对应一个subid

slotid:是指卡槽id,双卡机器的卡槽1值为0,卡槽2值为1

SubscriptionInfo

每一张SIM卡都对应一个Subscription,用谁家的SIM卡就相当于订阅(Subscription)谁家的业务。 SIM卡的信息就是SubscriptionInfo(Subscription Information),比如iccid、MNC、MCC等,多张SIM卡就有多个SubscriptionInfo。

//frameworks/base/telephony/java/android/telephony/SubscriptionInfo.java

public class SubscriptionInfo implements Parcelable {

     @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(mId);                         //数据库id,递增主键,每一个iccid的卡会占用1个id
            dest.writeString(mIccId);                   //sim卡的iccid,每张sim卡是唯一的
            dest.writeInt(mSimSlotIndex);               //sim卡插入卡槽值,0是卡1,1是卡2,没有插入则是-1
            dest.writeCharSequence(mDisplayName);       //sim卡名称,用户可以自定义
            dest.writeCharSequence(mCarrierName);       //运营商名称
            dest.writeInt(mNameSource);                 //名称来源,是用户设置或者是从sim卡读取(一般就是运营商名称)等
            dest.writeInt(mIconTint);                   //sim卡图标染色值,tint的概念可以百度google
            dest.writeString(mNumber);                  //sim卡关联号码
            dest.writeInt(mDataRoaming);                //sim卡是否启用数据漫游
            dest.writeInt(mMcc);                        //mcc,移动国家码,3位数字,中国是460
            dest.writeInt(mMnc);                        //mnc,移动网络码,2位数字,如00,01等,表示运营商
            dest.writeString(mCountryIso);              //国家iso代码
            mIconBitmap.writeToParcel(dest, flags);     //sim卡图标
        }
        ......
}

SubscriptionManager

SubscriptionManager为第三方app层使用,用于:
1). 获取和设置当前双卡设置(如当前默认拨号卡);
2). 进行slotid和subId转换等;
3). 获取当前的卡信息SubscriptionInfo。(请注意,对某些电话信息的访问是受权限保护的。您的应用程序无法访问受保护的信息,除非它具有在其清单文件中声明的适当权限。在适用权限的情况下,它们会在您访问受保护信息的方法中注明。)

SubscriptionManager //frameworks/base/telephony/java/android/telephony/SubscriptionManager.java
    1). 获取SubscriptionManager对象
        public static SubscriptionManager from(Context context);
        //SubscriptionManager mSubscrMgr = SubscriptionManager.from(mContext);//get Manager
    2). 第三方app获取slot和subId
        public int getDefaultDataPhoneId()  默认数据slotId
        public int getDefaultSmsPhoneId()  默认短信slotId
        public static int getDefaultVoicePhoneId()  默认通话slotId

        public static int getDefaultDataSubscriptionId() 默认数据subId
        public static int getDefaultSmsSubscriptionId() 默认短信subId
        public static int getDefaultVoiceSubscriptionId() 默认通话subId
        上述三个都返回-1的话使用
        public static int getDefaultSubscriptionId() 获取默认subId

        public static int getActiveDataSubscriptionId() 获取当前使用流量的卡id
    3). slotid和subId转换
        public static int getSlotIndex(int subId)
        public static int getPhoneId(int subId)
        public static int[] getSubId(int slotIndex)
    4). 第三方app获取SubscriptionInfo
        public SubscriptionInfo getActiveSubscriptionInfoForSimSlotIndex(int slotIndex) 根据卡槽获取对应的SubscriptionInfo
        public SubscriptionInfo getActiveSubscriptionInfo(int subId) 根据subId获取对应的SubscriptionInfo  
    5). 根据subid获取状态
        public boolean isNetworkRoaming (int subId) 是否网络漫游
        public String getPhoneNumber (int subscriptionId) 获取电话号码        
        public static int getSlotIndex (int subscriptionId) 获取卡槽索引
public SubscriptionInfo getActiveSubscriptionInfo (int subId) 获取活动订阅(sim卡)信息

TelephonyManager

package com.ljq.activity;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.CellLocation;
import android.telephony.NeighboringCellInfo;
import android.telephony.TelephonyManager;
public class TelephonyManagerActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    /**
     * 返回电话状态
     * 
     * CALL_STATE_IDLE 无任何状态时 
     * CALL_STATE_OFFHOOK 接起电话时
     * CALL_STATE_RINGING 电话进来时 
     */
    tm.getCallState();
    //返回当前移动终端的位置
    CellLocation location=tm.getCellLocation();
    //请求位置更新,如果更新将产生广播,接收对象为注册LISTEN_CELL_LOCATION的对象,需要的permission名称为ACCESS_COARSE_LOCATION。
    location.requestLocationUpdate();
    /**
     * 获取数据活动状态
     * 
     * DATA_ACTIVITY_IN 数据连接状态:活动,正在接受数据
     * DATA_ACTIVITY_OUT 数据连接状态:活动,正在发送数据
     * DATA_ACTIVITY_INOUT 数据连接状态:活动,正在接受和发送数据
     * DATA_ACTIVITY_NONE 数据连接状态:活动,但无数据发送和接受
     */
    tm.getDataActivity();
    /**
     * 获取数据连接状态
     * 
     * DATA_CONNECTED 数据连接状态:已连接
     * DATA_CONNECTING 数据连接状态:正在连接
     * DATA_DISCONNECTED 数据连接状态:断开
     * DATA_SUSPENDED 数据连接状态:暂停
     */
    tm.getDataState();
    /**
     * 返回当前移动终端的唯一标识
     * 
     * 如果是GSM网络,返回IMEI;如果是CDMA网络,返回MEID
     */
    tm.getDeviceId();
    //返回移动终端的软件版本,例如:GSM手机的IMEI/SV码。
    tm.getDeviceSoftwareVersion();
    //返回手机号码,对于GSM网络来说即MSISDN
    tm.getLine1Number();
    //返回当前移动终端附近移动终端的信息
    List<NeighboringCellInfo> infos=tm.getNeighboringCellInfo();
    for(NeighboringCellInfo info:infos){
      //获取邻居小区号
      int cid=info.getCid();
      //获取邻居小区LAC,LAC: 位置区域码。为了确定移动台的位置,每个GSM/PLMN的覆盖区都被划分成许多位置区,LAC则用于标识不同的位置区。
      info.getLac();
      info.getNetworkType();
      info.getPsc();
      //获取邻居小区信号强度 
      info.getRssi();
    }
    //返回ISO标准的国家码,即国际长途区号
    tm.getNetworkCountryIso();
    //返回MCC+MNC代码 (SIM卡运营商国家代码和运营商网络代码)(IMSI)
    tm.getNetworkOperator();
    //返回移动网络运营商的名字(SPN)
    tm.getNetworkOperatorName();
    /**
     * 获取网络类型
     * 
     * NETWORK_TYPE_CDMA 网络类型为CDMA
     * NETWORK_TYPE_EDGE 网络类型为EDGE
     * NETWORK_TYPE_EVDO_0 网络类型为EVDO0
     * NETWORK_TYPE_EVDO_A 网络类型为EVDOA
     * NETWORK_TYPE_GPRS 网络类型为GPRS
     * NETWORK_TYPE_HSDPA 网络类型为HSDPA
     * NETWORK_TYPE_HSPA 网络类型为HSPA
     * NETWORK_TYPE_HSUPA 网络类型为HSUPA
     * NETWORK_TYPE_UMTS 网络类型为UMTS
     * 
     * 在中国,联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO
     */
    tm.getNetworkType();
    /**
     * 返回移动终端的类型
     * 
     * PHONE_TYPE_CDMA 手机制式为CDMA,电信
     * PHONE_TYPE_GSM 手机制式为GSM,移动和联通
     * PHONE_TYPE_NONE 手机制式未知
     */
    tm.getPhoneType();
    //返回SIM卡提供商的国家代码
    tm.getSimCountryIso();
    //返回MCC+MNC代码 (SIM卡运营商国家代码和运营商网络代码)(IMSI)
    tm.getSimOperator();
    tm.getSimOperatorName();
    //返回SIM卡的序列号(IMEI)
    tm.getSimSerialNumber();
    /**
     * 返回移动终端
     * 
     * SIM_STATE_ABSENT SIM卡未找到
     * SIM_STATE_NETWORK_LOCKED SIM卡网络被锁定,需要Network PIN解锁
     * SIM_STATE_PIN_REQUIRED SIM卡PIN被锁定,需要User PIN解锁
     * SIM_STATE_PUK_REQUIRED SIM卡PUK被锁定,需要User PUK解锁
     * SIM_STATE_READY SIM卡可用
     * SIM_STATE_UNKNOWN SIM卡未知
     */
    tm.getSimState();
    //返回用户唯一标识,比如GSM网络的IMSI编号
    tm.getSubscriberId();
    //获取语音信箱号码关联的字母标识。 
    tm.getVoiceMailAlphaTag();
    //返回语音邮件号码
    tm.getVoiceMailNumber();
    tm.hasIccCard();
    //返回手机是否处于漫游状态
    tm.isNetworkRoaming();
    // tm.listen(PhoneStateListener listener, int events) ;
    //解释:
    //IMSI是国际移动用户识别码的简称(International Mobile Subscriber Identity)
    //IMSI共有15位,其结构如下:
    //MCC+MNC+MIN
    //MCC:Mobile Country Code,移动国家码,共3位,中国为460;
    //MNC:Mobile NetworkCode,移动网络码,共2位
    //在中国,移动的代码为电00和02,联通的代码为01,电信的代码为03
    //合起来就是(也是Android手机中APN配置文件中的代码):
    //中国移动:46000 46002
    //中国联通:46001
    //中国电信:46003
    //举例,一个典型的IMSI号码为460030912121001
    //IMEI是International Mobile Equipment Identity (国际移动设备标识)的简称
    //IMEI由15位数字组成的”电子串号”,它与每台手机一一对应,而且该码是全世界唯一的
    //其组成为:
    //1. 前6位数(TAC)是”型号核准号码”,一般代表机型
    //2. 接着的2位数(FAC)是”最后装配号”,一般代表产地
    //3. 之后的6位数(SNR)是”串号”,一般代表生产顺序号
    //4. 最后1位数(SP)通常是”0″,为检验码,目前暂备用
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值