怎么读取SIM卡信息
如何读取SIM卡信息
TelephonyManager的应用
手机的最主要功用就是打电话,如果没有电信公司提供的SIM卡,就不能正常地拨打电话,那么,我们有什么方法可以取得SIM卡的状态及相关资料呢?
Android API中的TelephonyManager(Android.telephony.TelephonyManager)对象,提供了几个方法可以快速取得SIM卡的状态及相关信息。
效果图:
程序中以getSystemService(TELEPHONY_SERVICE)来取得TelephonyManager对象,以TelephonyManager提供的方法来取得SIM卡状态及相关信息,将取得的信息存入自定义的MyAdapter中,最后以setListAdapter()将MyAdpter内的信息显示于ListView中。
Java代码:
01.import android.telephony.TelephonyManager;
02.
03.public class EX05_18 extends ListActivity {
04.private TelephonyManager telMgr;
05.private List<String> item=new ArrayList<String>();
06.private List<String> value=new ArrayList<String>();
07.
08.@SuppressWarnings("static-access")
09.@Override
10.public void onCreate(Bundle savedInstanceState) {
11.super.onCreate(savedInstanceState);
12./* 载入main.xml Layout */
13.setContentView(R.layout.main);
14.telMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
15./* 将取得的信息写入List中 */
16./* 取得SIM卡状态 */
17.item.add(getResources().getText(R.string.str_list0).toString());
18.if(telMgr.getSimState()==telMgr.SIM_STATE_READY) {
19.value.add("良好");
20.} else if(telMgr.getSimState()==telMgr.SIM_STATE_ABSENT) {
21.value.add("无SIM卡");
22.} else {
23.value.add("SIM卡被锁定或未知的状态");
24.}
25./* 取得SIM卡卡号 */
26.item.add(getResources().getText(R.string.str_list1).toString());
27.if(telMgr.getSimSerialNumber()!=null) {
28.value.add(telMgr.getSimSerialNumber());
29.} else {
30.value.add("无法取得");
31.}
32./* 取得SIM卡供货商代码 */
33.item.add(getResources().getText(R.string.str_list2).toString());
34.if(telMgr.getSimOperator().equals("")) {
35.value.add("无法取得");
36.} else {
37.value.add(telMgr.getSimOperator());
38.}
39./* 取得SIM卡供货商名称 */
40.item.add(getResources().getText(R.string.str_list3).toString());
41.if(telMgr.getSimOperatorName().equals("")) {
42.value.add("无法取得");
43.} else {
44.value.add(telMgr.getSimOperatorName());
45.}
46./* 取得SIM卡国别 */
47.item.add(getResources().getText(R.string.str_list4).toString());
48.if(telMgr.getSimCountryIso().equals("")) {
49.value.add("无法取得");
50.} else {
51.value.add(telMgr.getSimCountryIso());
52.}
53./* 使用自定义的MyAdapter来将数据传入ListActivity */
54.setListAdapter(new MyAdapter(this,item,value));
55.}
56.
57.}
复制代码
自定义的Adapter对象,以row_layout.xml作为Layout,程序中依照Layout的设置值来显示信息名称及信息内容。
Java代码:
01./* 自定义的Adapter,继承android.widget.BaseAdapter */
02.public class MyAdapter extends BaseAdapter {
03./* 变量声明 */
04.private LayoutInflater mInflater;
05.private List<String> items;
06.private List<String> values;
07./* MyAdapter的构造器,传入三个参数 */
08.public MyAdapter(Context context,List<String> item, List<String> value) {
09./* 参数初始化 */
10.mInflater = LayoutInflater.from(context);
11.itemitems = item;
12.valuevalues = value;
13.}
14./* 因继承BaseAdapter,需重写以下方法 */
15.@Override
16.public int getCount() {
17.return items.size();
18.}
19.
20.@Override
21.public Object getItem(int position) {
22.return items.get(position);
23.}
24.@Override
25.public long getItemId(int position) {
26.return position;
27.}
28.@Override
29.public View getView(int position,View convertView,ViewGroup par) {
30.ViewHolder holder;
31.if(convertView == null) {
32./* 使用自定义的file_row作为Layout */
33.convertView = mInflater.inflate(R.layout.row_layout,null);
34./* 初始化holder的text与icon */
35.holder = new ViewHolder();
36.holder.text1=(TextView)convertView.findViewById(R.id.myText1);
37.holder.text2=(TextView)convertView.findViewById(R.id.myText2);
38.convertView.setTag(holder);
39.} else {
40.holder = (ViewHolder) convertView.getTag();
41.}
42./* 设置要显示的信息 */
43.holder.text1.setText(items.get(position).toString());
44.holder.text2.setText(values.get(position).toString());
45.return convertView;
46.}
47./* class ViewHolder */
48.private class ViewHolder {
49./* text1:信息名称 * text2:信息内容 */
50.TextView text1;
51.TextView text2;
52.}
53.
54.}
复制代码
AndroidManifest.xml
AndroidManifest.xml本身必须要在Activity里设置读取电话状态的权限(Android.permission.READ_ PHONE_STATE)。
Java代码:
01.<uses-permission android:name="android.permission.READ_PHONE_STATE">
复制代码
在取得SIM卡的相关信息时,有时会因某些情况而取不到值。例如,手机没有插入SIM卡,这时候的返回值可能为null或空白字符串,所以在程序中添加空白与null的检查会是比较保险的做法,以免因此造成系统错误。
程序以TelephonyManager.getSimState()来取得SIM卡的状态,可能出现的返回状态如表
TelephonyManager的应用
手机的最主要功用就是打电话,如果没有电信公司提供的SIM卡,就不能正常地拨打电话,那么,我们有什么方法可以取得SIM卡的状态及相关资料呢?
Android API中的TelephonyManager(Android.telephony.TelephonyManager)对象,提供了几个方法可以快速取得SIM卡的状态及相关信息。
效果图:
程序中以getSystemService(TELEPHONY_SERVICE)来取得TelephonyManager对象,以TelephonyManager提供的方法来取得SIM卡状态及相关信息,将取得的信息存入自定义的MyAdapter中,最后以setListAdapter()将MyAdpter内的信息显示于ListView中。
Java代码:
01.import android.telephony.TelephonyManager;
02.
03.public class EX05_18 extends ListActivity {
04.private TelephonyManager telMgr;
05.private List<String> item=new ArrayList<String>();
06.private List<String> value=new ArrayList<String>();
07.
08.@SuppressWarnings("static-access")
09.@Override
10.public void onCreate(Bundle savedInstanceState) {
11.super.onCreate(savedInstanceState);
12./* 载入main.xml Layout */
13.setContentView(R.layout.main);
14.telMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
15./* 将取得的信息写入List中 */
16./* 取得SIM卡状态 */
17.item.add(getResources().getText(R.string.str_list0).toString());
18.if(telMgr.getSimState()==telMgr.SIM_STATE_READY) {
19.value.add("良好");
20.} else if(telMgr.getSimState()==telMgr.SIM_STATE_ABSENT) {
21.value.add("无SIM卡");
22.} else {
23.value.add("SIM卡被锁定或未知的状态");
24.}
25./* 取得SIM卡卡号 */
26.item.add(getResources().getText(R.string.str_list1).toString());
27.if(telMgr.getSimSerialNumber()!=null) {
28.value.add(telMgr.getSimSerialNumber());
29.} else {
30.value.add("无法取得");
31.}
32./* 取得SIM卡供货商代码 */
33.item.add(getResources().getText(R.string.str_list2).toString());
34.if(telMgr.getSimOperator().equals("")) {
35.value.add("无法取得");
36.} else {
37.value.add(telMgr.getSimOperator());
38.}
39./* 取得SIM卡供货商名称 */
40.item.add(getResources().getText(R.string.str_list3).toString());
41.if(telMgr.getSimOperatorName().equals("")) {
42.value.add("无法取得");
43.} else {
44.value.add(telMgr.getSimOperatorName());
45.}
46./* 取得SIM卡国别 */
47.item.add(getResources().getText(R.string.str_list4).toString());
48.if(telMgr.getSimCountryIso().equals("")) {
49.value.add("无法取得");
50.} else {
51.value.add(telMgr.getSimCountryIso());
52.}
53./* 使用自定义的MyAdapter来将数据传入ListActivity */
54.setListAdapter(new MyAdapter(this,item,value));
55.}
56.
57.}
复制代码
自定义的Adapter对象,以row_layout.xml作为Layout,程序中依照Layout的设置值来显示信息名称及信息内容。
Java代码:
01./* 自定义的Adapter,继承android.widget.BaseAdapter */
02.public class MyAdapter extends BaseAdapter {
03./* 变量声明 */
04.private LayoutInflater mInflater;
05.private List<String> items;
06.private List<String> values;
07./* MyAdapter的构造器,传入三个参数 */
08.public MyAdapter(Context context,List<String> item, List<String> value) {
09./* 参数初始化 */
10.mInflater = LayoutInflater.from(context);
11.itemitems = item;
12.valuevalues = value;
13.}
14./* 因继承BaseAdapter,需重写以下方法 */
15.@Override
16.public int getCount() {
17.return items.size();
18.}
19.
20.@Override
21.public Object getItem(int position) {
22.return items.get(position);
23.}
24.@Override
25.public long getItemId(int position) {
26.return position;
27.}
28.@Override
29.public View getView(int position,View convertView,ViewGroup par) {
30.ViewHolder holder;
31.if(convertView == null) {
32./* 使用自定义的file_row作为Layout */
33.convertView = mInflater.inflate(R.layout.row_layout,null);
34./* 初始化holder的text与icon */
35.holder = new ViewHolder();
36.holder.text1=(TextView)convertView.findViewById(R.id.myText1);
37.holder.text2=(TextView)convertView.findViewById(R.id.myText2);
38.convertView.setTag(holder);
39.} else {
40.holder = (ViewHolder) convertView.getTag();
41.}
42./* 设置要显示的信息 */
43.holder.text1.setText(items.get(position).toString());
44.holder.text2.setText(values.get(position).toString());
45.return convertView;
46.}
47./* class ViewHolder */
48.private class ViewHolder {
49./* text1:信息名称 * text2:信息内容 */
50.TextView text1;
51.TextView text2;
52.}
53.
54.}
复制代码
AndroidManifest.xml
AndroidManifest.xml本身必须要在Activity里设置读取电话状态的权限(Android.permission.READ_ PHONE_STATE)。
Java代码:
01.<uses-permission android:name="android.permission.READ_PHONE_STATE">
复制代码
在取得SIM卡的相关信息时,有时会因某些情况而取不到值。例如,手机没有插入SIM卡,这时候的返回值可能为null或空白字符串,所以在程序中添加空白与null的检查会是比较保险的做法,以免因此造成系统错误。
程序以TelephonyManager.getSimState()来取得SIM卡的状态,可能出现的返回状态如表