从SIM卡中读取联系人信息

 这个包中包含了3个主要类,但是都是独立的。具体的看下面的说明:

1.phonetest1.java 说明:
    在写程序中,有时候可能需要获取sim卡中的一些联系人资料。在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息。还要说一句就是,在这里是应该必须判断联系人的,这样我们才能正常的查询。
       
这个程序主要是学会判断SIM卡的状态,学会从SIM卡读取联系人。

2.phonetest2.java 可以把手机本地中的联系人取出来放在ListView中显示,触发选择事件就发短信,触发单击事件就打电话。

3.phonetest3.java 是手机本地通讯录增删改查联系人的代码,同时,DeleteContactActivity.java/NewContactActivity.java/UpdateContactActivity.java  都是和PhoneTest3一起的

4.对于从SIM卡读取联系人,1.5和2.2的好像没有区别;手机本地取联系人,1.5和2.2的区别才大。

5.在分别测试每个程序的时候,大家要自己去Manifest中更改下配置。这3个程序是完全独立的。

 最近要用到读取联系人的功能,那么联系人保存在两个地方,一个是SIM卡,就是我们的手机卡;另一个就是手机本地数据库中保存的联系人信息。大家可以拿出自己的手机,选定某一个联系人,点击功能菜单,你会发现有一个选项是同步到SIM卡或者手机,这样就是说:你可以把联系人只保存在SIM卡上,或者只保存在手机本地数据库中,但是这样,当你的手机没电了,你想把卡放在别人手机上的时候,你的电话号码就很会没有你原来手机本地保存的那些联系人。你当然可以同时保存在SIM卡上和手机本地数据库中。
    OK,由此引申出两个重要的地方,第一:如何读取SIM卡的状态,如果读写SIM卡;第二:如何读写手机本地数据库中的联系人数据。我想,这是很基础的功能,任何一个人都要掌握的。我们在模拟器上可以添加联系人,但是请务必注意,这只是保存在手机本地数据库中的联系人,模拟器上是没有SIM卡的,因此,如果要读写SIM卡,就要用真机测试,但是苦于我有一个诺基亚的智能手机了,我又不舍得再买一个Android的手机做测试,因为最便宜的都得一千多,没办法,关于SIM卡的,我没办法测试。我只对手机本地数据库中的联系人做了测试。

    好了,我们回到正题。第一步,学会判断SIM卡的状态及其它的信息。可以参看示例代码。

    TelephonyManager的应用[取得SIM卡的状态]      
       手机的最主要功用就是打电话,如果没有电信公司提供的SIM卡,就不能正常地拨打电话,那么,我们有什么方法可以取得SIM卡的状态及相关资料呢?
Android API中的TelephonyManager(Android.telephony.TelephonyManager)对象,提供了几个方法可以快速取得SIM卡的状态及相关信息。
    程序中以getSystemService(TELEPHONY_SERVICE)来取得TelephonyManager对象,以TelephonyManager提供的方法来取得SIM卡状态及相关信息,将取得的信息存入自定义的MyAdapter中,最后以setListAdapter()将MyAdpter内的信息显示于ListView中。自定义的Adapter对象,以row_layout.xml作为Layout,程序中依照Layout的设置值来显示信息名称及信息内容。

AndroidManifest.xml
AndroidManifest.xml本身必须要在Activity里设置读取电话状态的权限(Android.permission.READ_ PHONE_STATE)。

    在取得SIM卡的相关信息时,有时会因某些情况而取不到值。例如,手机没有插入SIM卡,这时候的返回值可能为null或空白字符串,所以在程序中添加空白与null的检查会是比较保险的做法,以免因此造成系统错误。
程序以TelephonyManager.getSimState()来取得SIM卡的状态,可能出现的返回状态如表

效果图:
Capture.PNG

2011-8-17 11:19:29 上传
下载附件 (16.2 KB)




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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值