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

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

2012-06-16 14:47 399 查看
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
source

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
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
>
更多内容请访问:http://user.qzone.qq.com/764566684/infocenter
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息