您的位置:首页 > 移动开发 > Android开发

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

2016-09-23 10:49 337 查看
关闭

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。既然是prov
4000
ider,就和操作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技术学习网站
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: