扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
手机和 wifi 已经改变了人们的生活方式,成为生活的必需品。手机号码和宽带账号成为运营商相互竞争的重要一环,双卡双待的手机需求也逐渐增大,大多数手机厂商将主打手机改为双卡双待全网通,而运营商在占领主SIM卡后,对SIM卡2的欲望越来越大,获取SIM卡2的信息的需求也变大,只有知己知彼,才能占得先机。
成都创新互联主要从事做网站、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务义乌,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
这里简单介绍一下 Android 手机如何读取 Sim 卡信息
可以通过 ContentProvider 进行查询
使用 SubscriptionManager 类进行读取信息
通过 SubscriptionInfo 的实例进行读取信息,对应的是 Siminfo 的表字段,下面为该类源码:
该类没有常用的手机IMEI值和IMSI值,这个值可以通过 TelephonyManager 进行读取,不过需要通过反射,具体可见下方关于 TelephonyManager 的介绍
使用 TelephonyManager 读取SIM卡信息:
读取副卡信息大多只需要1个参数,slotId 或者 subId,源码方法如下(我们主要关心的是IMEI和IMSI,主要看getDeviceId和getSubscriberId方法):
可以看到源码中的这些方法均加了 @hide 的参数,无法直接调用,这里就需要用到反射:
现在就可以通过反射进行调用方法读取数据了
特别注意:
android 获取sim卡运营商信息
TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE); TelephonyManager 的使用 TelephonyManager 提供设备上获取通讯服务信息的入口,应用程序使用这个类的方法来获取电话的服务商或者状态。程序也可以注册一个监听器来监听电话状态的改变。 不需要直接实例化这个类,使用Context.getSystemService(Context.TELEPHONY_SERVICE)来获取这个类的实例。
注意:一些电话信息需要相应的权限。 方法无效
getSimOperatorName() Returns the Service Provider Name (SPN). // 获取服务提供商名字,比如电信,联通,移动 用下面的方法 第一种方法: 获取手机的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″)|| operator.equals(“46007″)){
//中国移动
}else if(operator.equals(“46001″)){
//中国联通
}else if(operator.equals(“46003″)){
//中国电信
} }
在文件AndroidManifest.xml中添加权限 其他方法具体使用方法请查看API 文档TelephonyManager中方法说明。
在文件 AndroidManifest.xml 中添加权限 uses-permission android:name="android.permission.READ_PHONE_STATE"/
TelephonyManager tel = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE);
String simOperator = tel.getSimOperator();
IMSI共有15位,其结构如下: MCC+MNC+MIN MCC:Mobile Country Code,移动国家码,共3位,中国为460; MNC:Mobile Network Code,移动网络码,共2位,电信03,移动02,联通GSM 01,一个典型的IMSI号码为460030912121001; MIN共有10位,其结构如下: 09+M0M1M2M3+ABCD 其中的M0M1M2M3和MDN号码中的H0H1H2H3可存在对应关系,ABCD四位为自由分配。 可以看出IMSI在MIN号码前加了MCC,可以区别出每个用户的来自的国家,因此可以实现国际漫游。在同一个国家内,如果有多个CDMA运营商,可以通过MNC来进行区别.
功能 说明
getCellLocation() 返回的单元格位置的装置 ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION
getDeviceId() 返回的IMEI / MEID的设备。 如果该设备是GSM设备 然后IMEI号将被退回,如果该设备是一个CDMA设备然后MEID 将被退回 READ_PHONE_STATE
getLine1Number() 返回设备的电话号码(MSISDN号码) READ_PHONE_STATE
getNetworkOperatorName() 返回注册的网络运营商的名字
getNetworkOperator() 返回的MCC +跨国公司的注册网络运营商
getNetworkCountryIso() 返回注册的网络运营商的国家代码
getSimCountryIso() 返回SIM卡运营商的国家代码 READ_PHONE_STATE
getSimOperator() 返回SIM卡运营商的单个核细胞数+冶 READ_PHONE_STATE
getSimOperatorName() 返回SIM卡运营商的名字 READ_PHONE_STATE
getSimSerialNumber() 返回SIM卡的序列号 READ_PHONE_STATE
getNetworkType() 返回网络设备可用的类型。 这将是 下列其中一个值:
TelephonyManager.NETWORK_TYPE_UNKNOWN TelephonyManager.NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_UMTS READ_PHONE_STATE getPhoneType() 返回设备的类型。 这将是以下值之一: TelephonyManager.PHONE_TYPE_NONE TelephonyManager.PHONE_TYPE_GSM TelephonyManager.PHONE_TYPE_CDMA READ_PHONE_STATE getSubscriberId() 返回用户识别码(的IMSI)的设备 READ_PHONE_STATE
getNeighboringCellInfo() 返回NeighboringCellInfo类代表名单 相邻小区的信息,如果可用,否则将 返回null ACCESS_COARSE_UPDATES
修改sim卡密码方法:
1、带着相关证件及用户卡(当初买号的时候带小卡的那个)去移动公司营业厅。
2、可以拨10086按1再按3重置密码。需要输入身份证号信息,验证才能修改密码。
3、sim卡密码一般都是指PIN码(PIN1),就是SIM卡的个人识别密码。
4、如果未经使用者修改,运营商设置的原始密码是1234或0000。
5、如果启用了开机PIN码,那么每次开机后就要输入4位数PIN码,PIN码是可以修改的,用来保护自己的SIM卡不被他人使用。
扩展
数字移动电话手机与模拟移动电话手机相比较,在结构上多了一块SIM卡。SIM卡叫用户识别卡。它实际上是一张内含大规模集成电路的智能卡片,用来登记用户的重要数据和信息。
SIM卡存储的数据可分为四类:第一类是固定存放的数据。这类数据在移动电话机被出售之前由SIM卡中心写入,包括国际移动用户识别号(IMSI)、鉴权密钥(KI)、鉴权和加密算法等等。第二类是暂时存放的有关网络的数据。如位置区域识别码(LAI)、移动用户暂时识别码(TMSI)、禁止接入的公共电话网代码等。第三类是相关的业务代码,如个人识别码(PIN)、解锁码(PUK)、计费费率等。第四类是电话号码簿,是手机用户随时输入的电话号码。用户全部资料几乎都存储在SIM卡内,因此SIM卡又称为用户资料识别卡。
SIM卡最重要的一项功能是进行鉴权和加密。当用户移动到新的区域拨打或接听电话时,交换机都要对用户进行鉴权,以确定是否为合法用户。这时,SIM卡和交换机同时利用鉴权算法,对鉴权密钥和8位随机数字进行计算,计算结果相同的,SIM卡被承认,否则,SIM卡被拒绝,用户无法进行呼叫。SIM卡还可利用加密算法,对话音进行加密,防止窃听。
数字移动电话手机只有装上SIM卡后才能使用,否则只是一部“裸机”,只能拨通网络中心许可的几个紧急号码,如110、119等。当SIM卡被插入任何一部符合数字移动电话系统规范的移动电话手机时,就可接打电话。通话费自动记入持卡人的帐单上,而与移动电话手机无关。
为了防止手机丢失后被盗用,每张SIM卡都可设置一个密码,即个人识别码(PIN码),用来对SIM上锁。它是由用户自己设定的,且可以随时更改。只有当用户输入正确的密码后,手机才能进入正常使用状态。连续三次输入错误的个人密码,手机便会将SIM卡锁住。要解锁,必须使用解锁码。如果你忘了这个号码,或SIM卡丢失,则需带齐开户资料,携机到当地的无线营业厅解锁或挂失。
可参考vivo内存卡与SIM卡的安装取出方法:进入手机设置--系统管理/我的设备--客户服务--使用手册--手机概览与快速入门--安装与准备中了解内存卡与SIM卡的安装取出方法。(部分机型进入设置--更多设置--使用手册/说明书--手机概览与快速入门--安装与准备中了解)
具体方法如下:
主要功能代码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041
/** * 获取SIM卡运营商 * * @param context * @return */public static String getOperators(Context context) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String operator = null; String IMSI = tm.getSubscriberId(); if (IMSI == null || IMSI.equals("")) { return operator; } if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) { operator = "中国移动"; } else if (IMSI.startsWith("46001")) { operator = "中国联通"; } else if (IMSI.startsWith("46003")) { operator = "中国电信"; } return operator;} /** * 手机型号 * * @return */public static String getPhoneModel() { return android.os.Build.MODEL;} /** * 系统版本 * * @return */public static String getSystemVersion() { return android.os.Build.VERSION.RELEASE;}
权限代码如下:
1
uses-permission android:name="android.permission.READ_PHONE_STATE"/
希望本文所述对大家的Android程序设计有所帮助
您可能感兴趣的文章:
Android4.X中SIM卡信息初始化过程详解
Android获取手机通讯录、sim卡联系人及调用拨号界面方法
android监控sim卡有没有服务示例(sim卡管理)
Android读取用户号码,手机串号,SIM卡序列号的实现代码
Android 判断SIM卡属于哪个移动运营商的实现代码
Android8.1 源码修改之插入SIM卡默认启用Volte功能
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,最后进行处理该字段读完后应该执行的操作。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流