没有sim卡android获取sim卡信息 能获取手机短信吗

Android开发之获取手机SIM卡信息
TelephonyManager是一个管理手机通话状态、电话网络信息的服务类,该类提供了大量的getXxx(),方法获取电话网络的相关信息。
TelephonyManager类概述:
可用于访问有关设备上的电话服务信息。应用程序可以使用这个类的方法来确定电话服务和状态,以及访问某些类型的用户信息。应用程序还可以注册一个侦听器以接收的电话状态变化通知。
你不能直接实例化这个类;相反,你可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法还获取初始化TelephonyManager实例。
需要注意的是访问某些电话信息permission-protected。。你的应用程序应该获得访问手机位置和状态的的一些权限。
TelephonyManager类提供的主要的方法:
Public Methods
getCallState()
返回一个常数,表示设备上的呼叫状态
CellLocation
getCellLocation()
返回设备的当前位置。
getDataActivity()
返回一个常数,表示活动的数据连接的类型。
getDataState()
返回一个常数表示当前数据连接状态
getDeviceId()
返回唯一的设备ID,例如,IMEI GSM和MEID
CDMA手机。
getDeviceSoftwareVersion()
返回设备的软件版本号,例如,的IMEI
/ SV GSM手机。
getLine1Number()
返回1号线的电话号码,例如,MSISDN用于GSM电话。
getNeighboringCellInfo()
返回设备的相邻小区信息。
getNetworkCountryIso()
返回注册的网络运营商的国家代码
getNetworkOperator()
返回的MCC +跨国公司的注册网络运营商
getNetworkOperatorName()
返回注册的网络运营商的名字
getNetworkType()
返回一个常数,表示目前在设备上使用的无线电技术(网络类型)。
getPhoneType()
返回设备的类型(手机制式)。
getSimCountryIso()
返回SIM卡运营商的国家代码
getSimOperator()
返回MCC +跨国公司(移动国家代码+移动网络代码)的提供者的SIM卡。
getSimOperatorName()
返回服务提供者的名称(SPN)。
getSimSerialNumber()
返回SIM卡的序列号,如果适用的话。
getSimState()
返回一个常数表示SIM卡设备的状态。
getSubscriberId()
返回唯一的用户ID,例如,IMSI为GSM手机。
getVoiceMailAlphaTag()
检索与语音信箱号码相关的字母标识符。
getVoiceMailNumber()
返回语音信箱号码。
hasIccCard()
isNetworkRoaming()
返回true,如果该设备被认为是漫游当前网络上,支持GSM目的。
listen(PhoneStateListener listener, int events)
注册一个侦听器对象接收改变指定的电话状态的通知。
应用实例:
运行效果图:
TelephonyStatus类:
vcD4KPHByZSBjbGFzcz0="brush:">package com.jph.
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
import android.os.B
import android.app.A
import android.content.C
import android.telephony.TelephonyM
import android.widget.ListV
import android.widget.SimpleA
* Describe:
* 获取Sim卡信息
* 本实例通过TelephonyManager类的对象的getXxx()
* 方法获取手机Sim卡信息。
* @author jph
public class TelephonyStatus extends Activity {
ListView listS
//创建一个tManager类的实例
TelephonyManager tM
//声明一个表示Sim卡状态名的数组
String []statusName=new String[]{};
//声明一个表示Sim卡状态值得集合
ArrayListstatusValue=new ArrayList();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listShow=(ListView)findViewById(R.id.listShow);
//获取的tManager对象
tManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
//获取表示各种状态名的数组
statusName=getResources().getStringArray(R.array.statusName);
//获取表示sim卡状态的的数组
String simStatus[]=getResources().getStringArray(R.array.simStatus);
//获取表示手机类型的数组
String phoneType[]=getResources().getStringArray(R.array.phoneType);
//获取设备编号
statusValue.add(tManager.getDeviceId());
//获取设备类型
statusValue.add(phoneType[tManager.getPhoneType()]);
//获取软件版本
statusValue.add(tManager.getDeviceSoftwareVersion()==null?"未知"
:tManager.getDeviceSoftwareVersion());
//获取设备当前位置
statusValue.add(tManager.getCellLocation()==null? "未知"
:tManager.getCellLocation().toString());
//获取设备呼叫状态
switch (tManager.getCallState()) {
case TelephonyManager.CALL_STATE_IDLE:
statusValue.add("空闲");
case TelephonyManager.CALL_STATE_OFFHOOK:
statusValue.add("正在通话");
case TelephonyManager.CALL_STATE_RINGING:
statusValue.add("等待接听");
//获取电话号码
statusValue.add(tManager.getLine1Number());
//获取运营商的国家代码
statusValue.add(tManager.getNetworkCountryIso());
//获取运营商的名称
statusValue.add(tManager.getNetworkOperatorName());
//获取网络类型
statusValue.add(getNetworkType(tManager.getNetworkType()));
statusValue.add(tManager.getSimOperatorName().equals("")?"未知"
:tManager.getSimOperatorName());
//获取SIM卡的序列号
statusValue.add(tManager.getSimSerialNumber());
//获取SIM卡状态
statusValue.add(simStatus[tManager.getSimState()]);
List<Map> listItems=new ArrayList<Map>();
// 遍历statusValues集合,将statusNames、statusValues
// 的数据封装到List<Map>集合中
for (int i = 0; i < statusName. i++) {
MaplistItem=new HashMap();
listItem.put("name",statusName[i]);
listItem.put("value",statusValue.get(i));
listItems.add(listItem);
SimpleAdapter adapter=new SimpleAdapter(this, listItems, R.layout.line,
new String[]{"name","value"},new int[]{R.id.txtName,R.id.txtValue});
//为listShow设置Adapter
listShow.setAdapter(adapter);
//获取手机网络类型
private String getNetworkType(int networkType) {
// TODO Auto-generated method stub
switch (networkType) {
case TelephonyManager.NETWORK_TYPE_1xRTT:
return "1xRTT";
case TelephonyManager.NETWORK_TYPE_CDMA:
return "CDMA";
case TelephonyManager.NETWORK_TYPE_EDGE:
return "EDGE";
case TelephonyManager.NETWORK_TYPE_EHRPD:
return "EHRPD";
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return "EVDO_0";
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return "EVDO_A";
case TelephonyManager.NETWORK_TYPE_EVDO_B:
return "EVDO_B";
case TelephonyManager.NETWORK_TYPE_GPRS:
return "GPRS";
case TelephonyManager.NETWORK_TYPE_HSDPA:
return "HSDPA";
case TelephonyManager.NETWORK_TYPE_HSPA:
return "HSPA";
case TelephonyManager.NETWORK_TYPE_HSPAP:
return "HSPAP";
case TelephonyManager.NETWORK_TYPE_HSUPA:
return "HSUPA";
case TelephonyManager.NETWORK_TYPE_IDEN:
return "IDEN";
case TelephonyManager.NETWORK_TYPE_LTE:
return "LTE";
case TelephonyManager.NETWORK_TYPE_UMTS:
return "UMTS";
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
return "UNKNOWN";
return "UNKNOWN";
设备当前位置
设备呼叫状态
运营商的国家代码
运营商的名称
SIM卡的序列号
被NetWork PIN加锁
Manifest.xml
关于TelephonyManager其它实际应用可参照:Android开发之监听手机来电26529人阅读
android 获取sim卡运营商信息
TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE); TelephonyManager 的使用 TelephonyManager 提供设备上获取通讯服务信息的入口,应用程序使用这个类的方法来获取电话的服务商或者状态。程序也可以注册一个监听器来监听电话状态的改变。 不需要直接实例化这个类,使用Context.getSystemService(Context.TELEPHONY_SERVICE)来获取这个类的实例。
注意:一些电话信息需要相应的权限。 方法无效
getSimOperatorName() &#65279;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&#43;MNC&#43;MIN MCC:Mobile Country Code,移动国家码,共3位,中国为460; MNC:Mobile Network Code,移动网络码,共2位,电信03,移动02,联通GSM 01,一个典型的IMSI号码为001; MIN共有10位,其结构如下: 09&#43;M0M1M2M3&#43;ABCD 其中的M0M1M2M3和MDN号码中的H0H1H2H3可存在对应关系,ABCD四位为自由分配。 可以看出IMSI在MIN号码前加了MCC,可以区别出每个用户的来自的国家,因此可以实现国际漫游。在同一个国家内,如果有多个CDMA运营商,可以通过MNC来进行区别.
getCellLocation() 返回的单元&#26684;位置的装置 ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION
getDeviceId() 返回的IMEI / MEID的设备。 如果该设备是GSM设备 然后IMEI号将被退回,如果该设备是一个CDMA设备然后MEID 将被退回 READ_PHONE_STATE
getLine1Number() 返回设备的电话号码(MSISDN号码) READ_PHONE_STATE
getNetworkOperatorName() 返回注册的网络运营商的名字
getNetworkOperator() 返回的MCC &#43;跨国公司的注册网络运营商
getNetworkCountryIso() 返回注册的网络运营商的国家代码
getSimCountryIso() 返回SIM卡运营商的国家代码 READ_PHONE_STATE
getSimOperator() 返回SIM卡运营商的单个核细胞数&#43;冶 READ_PHONE_STATE
getSimOperatorName() 返回SIM卡运营商的名字 READ_PHONE_STATE
getSimSerialNumber() 返回SIM卡的序列号 READ_PHONE_STATE
getNetworkType() 返回网络设备可用的类型。 这将是 下列其中一个&#20540;:
TelephonyManager.NETWORK_TYPE_UNKNOWN TelephonyManager.NETWORK_TYPE_GPRS TelephonyManager.NETWORK_TYPE_EDGE TelephonyManager.NETWORK_TYPE_UMTS READ_PHONE_STATE getPhoneType() 返回设备的类型。 这将是以下&#20540;之一: 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
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:190303次
积分:1814
积分:1814
排名:千里之外
转载:61篇
评论:18条
(1)(3)(4)(3)(3)(11)(8)(7)(4)(1)(11)(9)怎么在android没启动(即recovery模式下)读取SIM卡信息 - 驱动开发当前位置:& &&&怎么在android没启动(即recovery模式下)读取SIM卡怎么在android没启动(即recovery模式下)读取SIM卡信息&&网友分享于:&&浏览:48次如何在android没启动(即recovery模式下)读取SIM卡信息recovery模式下android是没有启动的
我想读取SIM卡信息,请问有什么方法吗?&
------解决方案--------------------AT命令
在recovery下面实际就是linux&kernel跟modem通信------解决方案--------------------那就在recovery&init时将modem服务起来再发和tty通信呗?
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有【教程】Android读取SIM卡短信流程
我们平板项目从android4.1开始就读不到SIM卡短信了,包括s203,&s77,&s88(android&4.2)都是这样。S203&andorid&4.0的版本是没有这个问题的,而4.0和4.1用的ril代码基本一样,所以应该不是ril库的问题。所以看了下读SIM卡短信的流程,现整理如下:
首先最上面肯定是从Mms&Apk中开始,3G模块正常工作且检测到SIM卡之后,Mms的设置菜单中会有一个管理Sim卡短信的选项,点击可以打开SIM卡短信管理的界面。这个界面一个叫ManageSimMessages&的&activity.
在该activity的onCreate中,可以看到,使用了一个&AsyncQueryHandler的异步查询框架。当时看到这个地方就开始没头绪了,因为这个类算是android的系统API,这里只能看到调了startQuery和&onQueryComplete,没法看到startQuery之后如何工作的。
上层没线索了,就从最下层开始。查SIM卡短信,其实是给模块发AT+CRSM命令,ril&HAL里面看,是Framework里面下发RIL_REQUEST_SIM_IO这个命令。所以到frameworkRIL.java里面找这个命令,可以很容易追到这个命令的地方。但是从Mms里面的startQuery怎么调到这个地方的还是很难追踪,这种情况有个小技巧,在这个地方写个空指针爆掉的操作,然后去看mainlog,整个调用栈就全打印出来了。
看到调用流程之后,再从上面开始整理一下。
从调用栈来看,Andoid是把SIM卡短信抽象成一个数据库的,对SIM卡短信的管理也是通过数据库的方式来操作的。AsyncQueryHandler&里面startQuery开始后,就通过Binder,&Proxy机制(这两个东西大概知道怎么回事,没有详细研究过,后面详细看下这块东西)Bind到了ContentProvider的Query,然后又调到SmsProvider.query,&&SmsPovider在TelephonyPovider&里面,代码位置&package/providers/TelephonyProvider。从AsyncQueryHandler如何跑到SmsProvider这里的先不管,到这里至少找到了继续往下层调的线索。
这里匹配到Mms里面Query的时候传进来的token,一路调下去到RIL.java里面,比较简单,在此不做详述。
调用流程清楚了,再看下最初的问题,Android4.1项目开始,读不到SIM卡短信。
代码跟下来,读SIM卡短信前,先去获得当前SIM卡容量。问题就是出在这里了,Android4.0&跟&Android&4.1里面解析SIM卡容量部分的协议代码居然不一样,如下图。是在原4.1的代码基础上按4.0的做法来改的diff&(改了之后可以读到SIM卡短信了)
如图可以看出,Android4.1里面判断&TYPE_EF!=&data[RESPONSE_DATA_FILE_TYPE]&就直接throw了。去掉了data[RESPONSE_DATA_FILE_TYPE]&!=&0的判断,相当于降低了对SIM卡的兼容性。这里我调的SIM卡,报上来的data[RESPONSE_DATA_FILE_TYPE]正好等于&0。所以这里直接就throw了,就读不到短信了。
这里抓一个Log报上来的data&数据。
AT&+CRSM:&144,0,00BF3C8A608800
这里的data数组就是后面这一长串,每两个组成一个16进制数。
这里TYPE_EF&=&4
RESPONSE_DATA_FILE_TYPE&=&6
这里明显可以看到&data[6]=&00,上面红色标出来的。
欢迎大家加入清源的android学习培训&#9312;群,里面有高手和干货希望你能加入进来。一起学习和交流,群号是:,加群时请验证:qy777,谢谢!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 android获取sim卡信息 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信