这里还是和通讯录的权限是一样的
关于SIM卡相关状态的类是 TelephonyManager,其中包括获取SIM卡中各种状态,和SIM卡中的各种信息a
要想对SIM卡进行操作,首先先要查看SIM卡当前状态是否存在
myTelephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
switch(myTelephonyManager.getSimState())
{
case TelephonyManager.SIM_STATE_ABSENT:
Log.i(TAG, "找不到SIM卡");
break;
case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
Log.i(TAG, "需要网络解锁");
break;
case TelephonyManager.SIM_STATE_PIN_REQUIRED:
Log.i(TAG, "需要PIN解锁");
break;
case TelephonyManager.SIM_STATE_PUK_REQUIRED:
Log.i(TAG, "需要PUK解锁");
break;
case TelephonyManager.SIM_STATE_READY:
Log.i(TAG, "SIM卡就绪");
break;
case TelephonyManager.SIM_STATE_UNKNOWN:
Log.i(TAG, "未知状态");
break;
}
只要当状态是SIM_STATE_READY时,才开始后续操作。在模拟器上运行的时候会出现 未知状态,这里需要真机测试
接下来的事就和上面差不多了 首先是通过查询获得游标,这里需要注意的是这里的Uri与手机的通讯录是不同的
content://icc/adn
mCursor = getContentResolver().query(Uri.parse(str), null,null, null, null);
通过mCursor.getColumnCount()我们可以知道 SIM卡中是有4列的 mCursor.getColumnName(X)我们可以知道表的结构是这样子的(不知道不同SIM卡 例如3G卡上的列名是否一样呢?)
name | number | emails | _id |
通过mCursor.getCount()我们可以知道总共联系人的数目
首先是查询操作
while (mCursor.moveToNext())
{
//取得名字
String name = mCursor.getString(mCursor.getColumnIndex("name")) + " ";
// 取得电话号码
String number = mCursor.getString(mCursor.getColumnIndex("number")) + " ";
// 取得邮箱
String email = mCursor.getString(mCursor.getColumnIndex("emails")) + " ";
// 取得id
String id = mCursor.getString(mCursor.getColumnIndex("_id")) + "\n";
}
但是如果加上条件查询的话,
例如这个写的时候查询号码是10086的联系人
mCursor = getContentResolver().query(Uri.parse(str), null,"number=?", new String[]{"10086"}, null);
有个很奇怪的地方 这时候mCursor.getColumnCount()返回的就是5了
这是通过mCursor.getColumnName(X)返回的表的结构就是
_id | name | tag | number | emails |
通过输出来看 其中 tag 和 name 中的内容是一样的 这时候的输入的_id不是无条件返回的那个数值了不知道是什么原因呢?
往SIM卡里增加记录是通过ContentValues的方式 但是需要注意的是 这里输入的name时不是以name作为标签,而是用 tag
ContentValues values = new ContentValues();
values.put("tag", "张小二");
values.put("number", "15088888888");
getContentResolver().insert(uri, values);
而更新也差不多 要注意的是,它是以原先的姓名和电话号码来匹配要更新的联系人的,故要指定4个属性。
ContentValues values = new ContentValues();
values.put("tag", "Jones");
values.put("number", "10086");
values.put("newTag","Fred");
values.put("newNumber", "10000");
getContentResolver().update(uri, values, null, null);
删除操作需要注意的是需要2个字段 一个是 tag 一个是number,例子如下
String where1 = "tag='" +"bbbbb"+"'";
where1 += " ANDnumber='" +"10086"+"'";
int delete1 = getContentResolver().delete(uri, where1, null);
System.out.println("where is"+where1);
System.out.println("delete is"+delete1);
特别注意 条件是 tag =’bbbbb’不能是 tag=bbbbb 否则将无法删除
如果删除成功 则delete1=1 如果失败则返回的是0