Android 判断 SIM卡 状态 并 读取 SIM卡 内容
1.判断SIM卡状态
 
   
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
     private List
private ListView mListView;
private List
@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
         Iterator
while (itItem.hasNext() && itValue.hasNext()) {
             HashMap
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.实例
[代码] PhoneTest.java
| 001 | packagecom.android.test;  | 
| 002 |     | 
| 003 | importandroid.app.Activity;  | 
| 004 | importandroid.content.Context;  | 
| 005 | importandroid.content.Intent;  | 
| 006 | importandroid.database.Cursor;  | 
| 007 | importandroid.net.Uri;  | 
| 008 | importandroid.os.Bundle;  | 
| 009 | importandroid.telephony.TelephonyManager;  | 
| 010 | importandroid.widget.TextView;  | 
| 011 |     | 
| 012 | publicclassPhoneTest extendsActivity   {  | 
| 013 |     privateTextView   mTextView;  | 
| 014 |     protectedCursor   mCursor = null;  | 
| 015 |     privateTelephonyManager   mTelephonyManager;  | 
| 016 |     privateString   mString = "";  | 
| 017 |         | 
| 018 |     /**   Called when the activity is first created. */ | 
| 019 |     @Override | 
| 020 |     publicvoidonCreate(Bundle   savedInstanceState) {  | 
| 021 |         super.onCreate(savedInstanceState);  | 
| 022 |         setContentView(R.layout.main);  | 
| 023 |         mTextView   = (TextView)findViewById(R.id.text);  | 
| 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 |     privatevoidgetSimContacts(String   str){  | 
| 035 |         Intent   intent = newIntent();  | 
| 036 |         intent.setData(Uri.parse(str));  | 
| 037 |         Uri   uri = intent.getData();  | 
| 038 |         mCursor   = getContentResolver().query(uri, null, null, null, null);  | 
| 039 |         if(mCursor   == null){  | 
| 040 |             mString   += "不能从"+   str + "读数据\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   += "列数:"+   mCursor.getColumnCount() + "\n";  | 
| 048 |         mString   += "行数:"+   mCursor.getCount() + "\n";  | 
| 049 |         if(mCursor   != null)   {  | 
| 050 |             while(mCursor.moveToNext())   {  | 
| 051 |                 //   取得联系人名字  | 
| 052 |                 intnameFieldColumnIndex   = mCursor.getColumnIndex("name");  | 
| 053 |                 mString   += mCursor.getString(nameFieldColumnIndex)+"      ";  | 
| 054 |                 //   取得电话号码  | 
| 055 |                 intnumberFieldColumnIndex   = mCursor  | 
| 056 |                         .getColumnIndex("number");  | 
| 057 |                 mString   += mCursor.getString(numberFieldColumnIndex)+"      ";  | 
| 058 |                 //   取得邮箱  | 
| 059 |                 intemailsFieldColumnIndex   = mCursor  | 
| 060 |                         .getColumnIndex("emails");  | 
| 061 |                 mString   += mCursor.getString(emailsFieldColumnIndex)+"      ";  | 
| 062 |                 //   取得id  | 
| 063 |                 intidFieldColumnIndex   = mCursor  | 
| 064 |                         .getColumnIndex("_id");  | 
| 065 |                 mString   += mCursor.getString(idFieldColumnIndex)+"\n";  | 
| 066 |             }  | 
| 067 |         }  | 
| 068 |         mString   += mCursor + "\n";  | 
| 069 |         mCursor.close();  | 
| 070 |     }  | 
| 071 |         | 
| 072 |     privateintgetSimState(){  | 
| 073 |         returnmTelephonyManager.getSimState();  | 
| 074 |     }  | 
| 075 |         | 
| 076 |     privatevoidisSimExist(){  | 
| 077 |         mTelephonyManager   = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  | 
| 078 |          intsimState   = mTelephonyManager.getSimState();  | 
| 079 |     | 
| 080 |          switch(simState)   {  | 
| 081 |     | 
| 082 |              caseTelephonyManager.SIM_STATE_ABSENT:  | 
| 083 |                  mString   = "无卡";  | 
| 084 |                  //   do something  | 
| 085 |                  break;  | 
| 086 |     | 
| 087 |              caseTelephonyManager.SIM_STATE_NETWORK_LOCKED:  | 
| 088 |                  mString   = "需要NetworkPIN解锁";  | 
| 089 |                  //   do something  | 
| 090 |     | 
| 091 |                  break;  | 
| 092 |     | 
| 093 |              caseTelephonyManager.SIM_STATE_PIN_REQUIRED:  | 
| 094 |                  mString   = "需要PIN解锁";  | 
| 095 |                  //   do something  | 
| 096 |                  break;  | 
| 097 |     | 
| 098 |              caseTelephonyManager.SIM_STATE_PUK_REQUIRED:  | 
| 099 |                  mString   = "需要PUN解锁";  | 
| 100 |                  //   do something  | 
| 101 |                  break;  | 
| 102 |     | 
| 103 |              caseTelephonyManager.SIM_STATE_READY:  | 
| 104 |                  mString   = "良好";  | 
| 105 |                  //   do something  | 
| 106 |                  break;  | 
| 107 |     | 
| 108 |              caseTelephonyManager.SIM_STATE_UNKNOWN:  | 
| 109 |                  mString   = "未知状态";  | 
| 110 |                  //   do something  | 
| 111 |                  break;  | 
| 112 |          }  | 
| 113 |          mTextView.setText(mString);  | 
| 114 |     }  | 
| 115 |         | 
| 116 | } | 
[代码] main.xml
| 01 | <?xmlversion="1.0"encoding="utf-8"?>  | 
| 02 | <LinearLayoutxmlns: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 |     <ScrollViewandroid:layout_width="fill_parent" | 
| 08 |     android:layout_height="fill_parent">  | 
| 09 |     <LinearLayoutandroid:orientation="vertical" | 
| 10 |     android:layout_width="fill_parent" | 
| 11 |     android:layout_height="fill_parent">  | 
| 12 |     <TextViewandroid: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 | <?xmlversion="1.0"encoding="utf-8"?>  | 
| 02 | <manifestxmlns: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 |     <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">  | 
| 09 |         <activityandroid:name=".PhoneTest" | 
| 10 |                   android:label="@string/app_name">  | 
| 11 |             <intent-filter>  | 
| 12 |                 <actionandroid:name="android.intent.action.MAIN"/>  | 
| 13 |                 <categoryandroid:name="android.intent.category.LAUNCHER"/>  | 
| 14 |             </intent-filter>  | 
| 15 |         </activity>  | 
| 16 |     | 
| 17 |     </application>  | 
| 18 |     <uses-permissionandroid:name="android.permission.READ_CONTACTS"></uses-permission>  | 
| 19 | </manifest> |