android 判断是不是有sim卡及运营商
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 判断是不是有sim卡及运营商相关的知识,希望对你有一定的参考价值。
获取IMSI串号,android SDK有相应的方法。(1)如果为空就是没插卡;
(2)1~3三位是国家码,460表示是中国的运营商,否则就是境外卡;
(3)4~5两位是运营码:移动00、02、04、07,联通GSM系统使用01、06,电信03、05、11,铁通20;
(4)不足之处:双卡手机是中国特色,Android SDK只能取到第一张卡得IMSI。至于哪张卡是第一张,每种品牌的手机不尽相同。 参考技术A
Android作为一个智能手机操作系统,SDK对SIM卡的读取有相关的操作,都封装在framework中
和SIM卡相关的类主要有以下几个:
IccConstants (里面记录很多的常量,主要用来存储某个字段在SIM卡上的位置是什么,比如ADN(sim卡上的电话本),6F3A, FDN(固定拔号 6F3B))IccCardStatus(记录SIM卡的状态,如ABSENT, READY,UNKNOW,ETC)
IccFileHandler(这个是用来SIM卡上的RECORD读完后,要处理什么事情)
IccRecords(SIM卡上的文件内容,每一个字段,一个RECORD)
IccProvider(手机上的数据库,读出来的数据全放这)
IccUtils(里面一般全是静态方法,主要用来码制转换)
IccSmsInterfaceManager,IccCard(这个是一个抽象类,会根据上面手机的制式,自动起一个SIMCARD 或者RUIMCARD)
以GSM为例说下读取的过程:
根据SIM卡的类型,进入SIMRecords, 开始探测SIM卡的状态,因为,有些SIM卡会设置有PIN码,如果SIM卡有PIN码的话,手机会弹出输入PIN码的框,等待用户进行解码,注意,这个时候,如果PIN码如果没有解的话,手机是不会去读SIM卡的,因为,读SIM卡时,必须通过PIN才能去读,只有一些比较特殊的字段,可以不用,比如ECC 也就是紧急呼叫号码(一般存在卡上,运营商定制的)。同时,这PIN码未解的情况,手机中SIM卡的状态也是PIN_REQURIED_BLOCK。
当解完PIN码,或是手机没有设置PIN码,这时,手机的会探测到SIM是READY的状态,手机只有检测到SIM READY,才会发出读卡的请求。
手机开始读卡第一个是IMSI(International Mobile SubscriberIdentification Number)主要用来查找运营商的网络,里面有MCC,MNC,ICCID(Integrate circuit card identity)唯一标识一个移动用户。
当低层的MODEM读到字段结果后,会有一个返回结果,由于发送读取请求时,有一个事件信息EVENT_GET_BINARY_SIZE_DONE,当有返回时,会直接交给IccFileHandler,然后由IccFileHandler转发给SIMRecords,最后进行处理该字段读完后应该执行的操作。
Android 判断SIM卡属于哪个移动运营商
第一种方法:
获取手机的IMSI码,并判断是中国移动\中国联通\中国电信
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); /** 获取SIM卡的IMSI码 * SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志, * 储存在SIM卡中,可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN组成,其中MCC为移动国家号码,由3位数字组成, * 唯一地识别移动客户所属的国家,我国为460;MNC为网络id,由2位数字组成, * 用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;MSIN为移动客户识别码,采用等长11位数字构成。 * 唯一地识别国内GSM移动通信网中移动客户。所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可 */ String imsi = telManager.getSubscriberId(); if(imsi!=null){ if(imsi.startsWith("46000") || imsi.startsWith("46002")){//因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号段使用了此编号 //中国移动 }else if(imsi.startsWith("46001")){ //中国联通 }else if(imsi.startsWith("46003")){ //中国电信 } }
第二种方法
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String operator = telManager.getSimOperator(); if(operator!=null){ if(operator.equals("46000") || operator.equals("46002")){ //中国移动 }else if(operator.equals("46001")){ //中国联通 }else if(operator.equals("46003")){ //中国电信 } }
以上是关于android 判断是不是有sim卡及运营商的主要内容,如果未能解决你的问题,请参考以下文章