Android 判断 SIM卡 状态 并 读取 SIM卡 内容
2012-06-16 14:47
399 查看
1.判断SIM卡状态
![](http://www.2cto.com/uploadfile/2011/1123/20111123024532286.gif)
package com.zeph.android.sim;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import android.app.ListActivity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class GetSIMinfoActivity extends ListActivity {
private TelephonyManager manager;
private List<String>item = new ArrayList<String>();
private List<String>value = new ArrayList<String>();
private ListView mListView;
private List<Map<String,Object>>mData = new ArrayList<Map<String,Object>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mListView = getListView();
manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
item.add("SIM卡状态");
switch (manager.getSimState()) {
case TelephonyManager.SIM_STATE_READY:
value.add("良好");
break;
case TelephonyManager.SIM_STATE_ABSENT:
value.add("无SIM卡");
break;
default:
value.add("SIM卡被锁定或未知状态");
break;
}
item.add("SIM卡序列号");
if (manager.getSimSerialNumber() != null)
value.add(manager.getSimSerialNumber());
else
value.add("无法取得");
item.add("SIM卡提供商代码");
if (manager.getSimOperator() != null)
value.add(manager.getSimOperator());
else
value.add("无法取得");
item.add("SIM卡提供商名称");
if (manager.getSimOperatorName() != null)
value.add(manager.getSimOperatorName());
else
value.add("无法取得");
item.add("SIM卡国别");
if (manager.getSimCountryIso() != null)
value.add(manager.getSimCountryIso());
else
value.add("无法取得");
Iterator<String>itItem = item.iterator();
Iterator<String>itValue = value.iterator();
while (itItem.hasNext() && itValue.hasNext()) {
HashMap<String,Object>map = new HashMap<String,Object>();
map.put("item",itItem.next());
map.put("value",itValue.next());
mData.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(),
mData,R.layout.item_value,new String[] { "item","value" },
new int[] { R.id.item,R.id.value });
mListView.setAdapter(adapter);
}
}
2.读取SIM卡信息
SIM的provider是IccProvider。既然是provider,就和操作Contact的provider类似的,只是有一些微小差别。
IccProvider的Uri是content://icc/and,可以通过这个Uri来操作SIM卡。当然,使用时需要转换为android的Uri对象。android中对SIM卡操作的支持很简单,具体的查询、插入、更新和删除操作如下面的代码段
一、查询联系人
查询时,只支持获取获取联系人,即query()函数的后面几个参数都为null(其它值不起作用)。同时,也不支持类似content://icc/and/0的查询。
public void SimQuery(Activity activity) {
Uri uri = Uri.parse("content://icc/adn");
Cursor cursor = activity.getContentResolver().query(uri,null,null,
null,null);
Log.d("1023",">>>>>>" +cursor.getCount());
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(People._ID));
String name = cursor.getString(cursor.getColumnIndex(People.NAME));
String phoneNumber = cursor.getString(cursor
.getColumnIndex(People.NUMBER));
Log.d("1023",">>>>>>" +"_id," +id);
Log.d("1023",">>>>>>" +"name," +name);
Log.d("1023",">>>>>>" +"phone number," +phoneNumber);
}
}
二、插入联系人
插入联系人只要设置名字和电话号码就可以了,要注意的是姓名对应的是tag,而不是name。
public void SimInsert(Activity activity) {
Uri uri = Uri.parse("content://icc/adn");
ContentValues values = new ContentValues();
values.put("tag","Jones");
values.put("number","10086");
Uri newSimContactUri = activity.getContentResolver()
.insert(uri,values);
Log.d("1023",
">>>>>>" +"new sim contact uri,"
+newSimContactUri.toString());
}
三、更新联系人
更新联系人要注意的是,它是以原先的姓名和电话号码来匹配要更新的联系人的,故要指定4个属性。
public void SimUpdate(Activity activity) {
Uri uri = Uri.parse("content://icc/adn");
ContentValues values = new ContentValues();
values.put("tag","Jones");
values.put("number","10086");
values.put("newTag","Fred");
values.put("newNumber","10000");
activity.getContentResolver().update(uri,values,null,null);
}
四、删除联系人
删除联系人,同样是以名字和电话号码来匹配的,故需要在delete的where参数中指定,下面的例子演示了删除所有SIM卡内的联系人。
public void SimDelete(Activity activity) {
Uri uri = Uri.parse("content://icc/adn");
Cursor cursor = activity.getContentResolver().query(uri,null,null,
null,null);
Log.d("1023",">>>>>>" +cursor.getCount());
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(People.NAME));
String phoneNumber = cursor.getString(cursor
.getColumnIndex(People.NUMBER));
String where = "tag='" +name +"'";
where += " AND number='" +phoneNumber +"'";
activity.getContentResolver().delete(uri,where,null);
}
}
上面的代码段我都测过,可以放心使用。要使上面的例子成功,则需要添加到SIM卡上的联系人有不同的名字或电话号码,若是有相同的姓名和电话号,可能会带来问题,这一点我未测过。还有,要注意的是SIM卡和U盘一样容易坏,若读写次数较多,很可能会坏掉。
3.实例
source
print?
更多内容请访问:http://user.qzone.qq.com/764566684/infocenter
![](http://www.2cto.com/uploadfile/2011/1123/20111123024532286.gif)
package com.zeph.android.sim;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import android.app.ListActivity;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class GetSIMinfoActivity extends ListActivity {
private TelephonyManager manager;
private List<String>item = new ArrayList<String>();
private List<String>value = new ArrayList<String>();
private ListView mListView;
private List<Map<String,Object>>mData = new ArrayList<Map<String,Object>>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mListView = getListView();
manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
item.add("SIM卡状态");
switch (manager.getSimState()) {
case TelephonyManager.SIM_STATE_READY:
value.add("良好");
break;
case TelephonyManager.SIM_STATE_ABSENT:
value.add("无SIM卡");
break;
default:
value.add("SIM卡被锁定或未知状态");
break;
}
item.add("SIM卡序列号");
if (manager.getSimSerialNumber() != null)
value.add(manager.getSimSerialNumber());
else
value.add("无法取得");
item.add("SIM卡提供商代码");
if (manager.getSimOperator() != null)
value.add(manager.getSimOperator());
else
value.add("无法取得");
item.add("SIM卡提供商名称");
if (manager.getSimOperatorName() != null)
value.add(manager.getSimOperatorName());
else
value.add("无法取得");
item.add("SIM卡国别");
if (manager.getSimCountryIso() != null)
value.add(manager.getSimCountryIso());
else
value.add("无法取得");
Iterator<String>itItem = item.iterator();
Iterator<String>itValue = value.iterator();
while (itItem.hasNext() && itValue.hasNext()) {
HashMap<String,Object>map = new HashMap<String,Object>();
map.put("item",itItem.next());
map.put("value",itValue.next());
mData.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(),
mData,R.layout.item_value,new String[] { "item","value" },
new int[] { R.id.item,R.id.value });
mListView.setAdapter(adapter);
}
}
2.读取SIM卡信息
android读取sim卡联系人
SIM的provider是IccProvider。既然是provider,就和操作Contact的provider类似的,只是有一些微小差别。IccProvider的Uri是content://icc/and,可以通过这个Uri来操作SIM卡。当然,使用时需要转换为android的Uri对象。android中对SIM卡操作的支持很简单,具体的查询、插入、更新和删除操作如下面的代码段
一、查询联系人
查询时,只支持获取获取联系人,即query()函数的后面几个参数都为null(其它值不起作用)。同时,也不支持类似content://icc/and/0的查询。
public void SimQuery(Activity activity) {
Uri uri = Uri.parse("content://icc/adn");
Cursor cursor = activity.getContentResolver().query(uri,null,null,
null,null);
Log.d("1023",">>>>>>" +cursor.getCount());
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(People._ID));
String name = cursor.getString(cursor.getColumnIndex(People.NAME));
String phoneNumber = cursor.getString(cursor
.getColumnIndex(People.NUMBER));
Log.d("1023",">>>>>>" +"_id," +id);
Log.d("1023",">>>>>>" +"name," +name);
Log.d("1023",">>>>>>" +"phone number," +phoneNumber);
}
}
二、插入联系人
插入联系人只要设置名字和电话号码就可以了,要注意的是姓名对应的是tag,而不是name。
public void SimInsert(Activity activity) {
Uri uri = Uri.parse("content://icc/adn");
ContentValues values = new ContentValues();
values.put("tag","Jones");
values.put("number","10086");
Uri newSimContactUri = activity.getContentResolver()
.insert(uri,values);
Log.d("1023",
">>>>>>" +"new sim contact uri,"
+newSimContactUri.toString());
}
三、更新联系人
更新联系人要注意的是,它是以原先的姓名和电话号码来匹配要更新的联系人的,故要指定4个属性。
public void SimUpdate(Activity activity) {
Uri uri = Uri.parse("content://icc/adn");
ContentValues values = new ContentValues();
values.put("tag","Jones");
values.put("number","10086");
values.put("newTag","Fred");
values.put("newNumber","10000");
activity.getContentResolver().update(uri,values,null,null);
}
四、删除联系人
删除联系人,同样是以名字和电话号码来匹配的,故需要在delete的where参数中指定,下面的例子演示了删除所有SIM卡内的联系人。
public void SimDelete(Activity activity) {
Uri uri = Uri.parse("content://icc/adn");
Cursor cursor = activity.getContentResolver().query(uri,null,null,
null,null);
Log.d("1023",">>>>>>" +cursor.getCount());
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(People.NAME));
String phoneNumber = cursor.getString(cursor
.getColumnIndex(People.NUMBER));
String where = "tag='" +name +"'";
where += " AND number='" +phoneNumber +"'";
activity.getContentResolver().delete(uri,where,null);
}
}
上面的代码段我都测过,可以放心使用。要使上面的例子成功,则需要添加到SIM卡上的联系人有不同的名字或电话号码,若是有相同的姓名和电话号,可能会带来问题,这一点我未测过。还有,要注意的是SIM卡和U盘一样容易坏,若读写次数较多,很可能会坏掉。
3.实例
[代码] PhoneTest.java
viewsource
print?
001 | package com.android.test; |
002 |
003 | import android.app.Activity; |
004 | import android.content.Context; |
005 | import android.content.Intent; |
006 | import android.database.Cursor; |
007 | import android.net.Uri; |
008 | import android.os.Bundle; |
009 | import android.telephony.TelephonyManager; |
010 | import android.widget.TextView; |
011 |
012 | public class PhoneTest extends Activity { |
013 | private TextView mTextView; |
014 | protected Cursor mCursor = null ; |
015 | private TelephonyManager |
016 | private String mString = "" ; |
017 |
018 | /** Called when the activity is first created. */ |
019 | @Override |
020 | public void onCreate(Bundle savedInstanceState) { |
021 | super .onCreate(savedInstanceState); |
022 | setContentView(R.layout.main); |
023 | mTextView |
024 | mTextView.setTextSize( 20 .3f); |
025 | isSimExist(); |
026 | if (getSimState() == TelephonyManager.SIM_STATE_READY){ |
027 | mString += " 卡存在\n" ; |
028 | getSimContacts( "content://icc/adn" ); //一般用这一条,如果这条不行的话可以试试下面的一条。 |
029 | getSimContacts( "content://sim/adn" );//此种读法在我们手机里不能读取,所以,还是用上个uri比较好。 |
030 | } |
031 | mTextView.setText(mString); |
032 | } |
033 |
034 | private void getSimContacts(String str){ |
035 | Intent intent = new Intent(); |
036 | intent.setData(Uri.parse(str)); |
037 | Uri |
038 | mCursor = getContentResolver().query(uri, null , null , null , null ); |
039 | if (mCursor == null ){ |
040 | mString += "不能从" + "读数据\n" ; |
041 | return ; |
042 | } |
043 | mString += "第一列:" + mCursor.getColumnName( 0 ) "\n" ; |
044 | mString += "第二列:" + mCursor.getColumnName( 1 ) "\n" ; |
045 | mString += "第三列:" + mCursor.getColumnName( 2 ) "\n" ; |
046 | mString += "第四列:" + mCursor.getColumnName( 3 ) "\n" ; |
047 | mString += "列数:" + "\n" ; |
048 | mString += "行数:" + "\n" ; |
049 | if (mCursor != null ) { |
050 | while (mCursor.moveToNext()) { |
051 | // 取得联系人名字 |
052 | int nameFieldColumnIndex = mCursor.getColumnIndex( "name" ); |
053 | mString +=mCursor.getString(nameFieldColumnIndex)+ " " ; |
054 | // 取得电话号码 |
055 | int numberFieldColumnIndex = mCursor |
056 | .getColumnIndex( "number" ); |
057 | mString +=mCursor.getString(numberFieldColumnIndex)+ " " ; |
058 | // 取得邮箱 |
059 | int emailsFieldColumnIndex = mCursor |
060 | .getColumnIndex( "emails" ); |
061 | mString +=mCursor.getString(emailsFieldColumnIndex)+ " " ; |
062 | // 取得id |
063 | int idFieldColumnIndex = mCursor |
064 | .getColumnIndex( "_id" ); |
065 | mString +=mCursor.getString(idFieldColumnIndex)+ "\n" ; |
066 | } |
067 | } |
068 | mString +=mCursor + "\n" ; |
069 | mCursor.close(); |
070 | } |
071 |
072 | private int getSimState(){ |
073 | return mTelephonyManager.getSimState(); |
074 | } |
075 |
076 | private void isSimExist(){ |
077 | mTelephonyManager |
078 | int simState |
079 |
080 | switch (simState) { |
081 |
082 | case TelephonyManager.SIM_STATE_ABSENT: |
083 | mString = "无卡" ; |
084 | // do something |
085 | break ; |
086 |
087 | case TelephonyManager.SIM_STATE_NETWORK_LOCKED: |
088 | mString = "需要NetworkPIN解锁" ; |
089 | // do something |
090 |
091 | break ; |
092 |
093 | case TelephonyManager.SIM_STATE_PIN_REQUIRED: |
094 | mString = "需要PIN解锁" ; |
095 | // do something |
096 | break ; |
097 |
098 | case TelephonyManager.SIM_STATE_PUK_REQUIRED: |
099 | mString = "需要PUN解锁" ; |
100 | // do something |
101 | break ; |
102 |
103 | case TelephonyManager.SIM_STATE_READY: |
104 | mString = "良好" ; |
105 | // do something |
106 | break ; |
107 |
108 | case TelephonyManager.SIM_STATE_UNKNOWN: |
109 | mString = "未知状态" ; |
110 | // do something |
111 | break ; |
112 | } |
113 | mTextView.setText(mString); |
114 | } |
115 |
116 | } |
[代码] main.xml
01 | <? xml version = "1.0" encoding = "utf-8" ?> |
02 | < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" |
03 | android:orientation = "vertical" |
04 | android:layout_width = "fill_parent" |
05 | android:layout_height = "fill_parent" |
06 | > |
07 | < ScrollView android:layout_width = "fill_parent" |
08 | android:layout_height = "fill_parent" > |
09 | < LinearLayout android:orientation = "vertical" |
10 | android:layout_width = "fill_parent" |
11 | android:layout_height = "fill_parent" > |
12 | < TextView android:id = "@+id/text" |
13 | android:layout_width = "fill_parent" |
14 | android:layout_height = "wrap_content" |
15 | android:text = "@string/hello" |
16 | /> |
17 | </ LinearLayout > |
18 | </ ScrollView > |
19 | </ LinearLayout > |
[代码] AndroidManefist.xml
01 | <? xml version = "1.0" encoding = "utf-8" ?> |
02 | < manifest xmlns:android = "http://schemas.android.com/apk/res/android" |
03 | package = "com.android.test" |
04 | android:versionCode = "1" |
05 | android:versionName = "1.0" > |
06 |
07 |
08 | < application android:icon = "@drawable/icon" android:label = "@string/app_name" > |
09 | < activity android:name = ".PhoneTest" |
10 | android:label = "@string/app_name" > |
11 | < intent-filter > |
12 | < action android:name = "android.intent.action.MAIN" /> |
13 | < category android:name = "android.intent.category.LAUNCHER" /> |
14 | </ intent-filter > |
15 | </ activity > |
16 |
17 | </ application > |
18 | < uses-permission android:name = "android.permission.READ_CONTACTS" ></ uses-permission > |
19 | </ manifest > |
相关文章推荐
- 【SIM】Android判断SIM卡状态并读取SIM卡内容
- Android判断SIM卡状态并读取SIM内容
- 十九、android中判断sim卡状态和读取联系人资料的方法
- android中判断sim卡状态和读取联系人资料的方法
- android中判断sim卡状态和读取联系人资料的方法
- android中判断sim卡状态和读取联系人资料的方法
- android中判断sim卡状态和读取联系人资料的方法
- android中判断sim卡状态和读取联系人资料的方法【转】
- android中判断sim卡状态和读取联系人资料的方法
- Android - 判断SIM卡状态
- 5.17学习内容 android判断软键盘状态、系统键盘监控、生成中间logo的二维码
- android中判断SIM卡状态
- Android读取sim卡的状态
- android-关于SIM卡状态信息获取类IccCardConstants.java
- Android EditText如何判断输入的内容有汉字
- Android中判断网络连接状态的方法
- Android中判断网络连接状态
- Android之判断设备网络连接状态,并判断连接方式
- Android判断和监听底座状态和类型的方法介绍