Android判断SIM卡状态并读取SIM内容

来源:互联网 发布:韩国拍照软件 编辑:程序博客网 时间:2024/05/18 23:55
关闭
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<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
view sourceprint?
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 mTelephonyManager;
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 = (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
    private void getSimContacts(String str){
035
        Intent intent = new Intent();
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
                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 = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
078
         int simState = mTelephonyManager.getSimState();
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>
 


关于我们 |联系我们 |广告服务 |投资合作 |版权申明 |在线帮助 |网站地图 |作品发布 |Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站

0 0
原创粉丝点击