Android SIM卡联系人操作总结
来源:互联网 发布:linux下安装jdk 编辑:程序博客网 时间:2024/05/30 05:00
--- by Ruiming.Lv
在Android中,对SIM中的联系人进行操作,需要通过系统提供的Content Provider进行,该Provider就是Telphony中的IccProvider。但是,由于SIM卡存储的一些特性,在操作上,与ContactsProvider有很多不一样。
1 IccProvider工程相关
IccProvider是Telephony中实现的Content Provider(IccProvider),它提供SIM卡联系人的相关操作。IccProvider源码所在的工程路径为:packages\services\Telephony。在该工程中,IccProvider的声明如下:
<providerandroid:name="IccProvider"
android:authorities="icc"
android:multiprocess="true"
android:exported="true"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS"/>。
IccProvider相关功能的具体实现主要在如下Java文件中:frameworks/opt/telephony/src/java/com/android/internal/telephony/IccProvider.java。另外,Telephony的包名为:com.android.phone,生成的APK的名称为:TeleService.apk。
2 IccProvider提供的URI
一般情况下,IccProvider对外提供的URI为:“content://icc/and”。如果系统支持双卡,用此URI操作的SIM卡为用户首选的SIM卡。对于双卡,某些芯片厂商会针对不同的SIM卡定义不同的URI,具体格式为:“content://icc/adn/subId/SubId”。其中SubId的值需要根据SIM卡当前的Subscription Id进行填充。例如,如果SIM1和SIM2的SubId分别为0和1,那么,这个两张SIM卡的URI为:“content://icc/adn/subId/0”和“content://icc/adn/subId/1”。
注意:
1.SubId可以通过SubscriptionInfo对象获取;
2.对于地址“content://icc/adn/subId/SubId”,并不是所有的IccProvider都支持。
3.对于某些SIM卡(类型为USIM或者CSIM)卡,可以支持如下格式的URI:content://icc/pbr/subId/SubId;而某些类型的SIM卡(类型为UIM或者SIM),支持的URI为:content://icc/adn/subId/SubId。Android的标准接口并没有提供获取SIM卡类型的接口,需要通过芯片厂商提供的接口获取(例如,MTK平台就专门提供了这样的接口)。不同的URI,所能操作的存储空间可能不一样,例如,电信的UIM卡,如果用ADN,则只能保存250个联系人;用PBR,则可以保存500个联系人。但是移动和联通卡的ADN和PBR都可以保存500个联系人。
3 SIM卡联系人数据库表的字段
IccProvider中返回的SIM卡联系人的字段如下:index, name, number, emails, additionalNumber, groupIds, _id, aas, sne。
4 IccProvider在联系人操作上的差异
1.1 查询联系人
在查询联系人时,不支持条件查询。
1.2 插入联系人
1.姓名字段不能为空;
2.号码字段不能有空格或者其它非数字字符;
3.在填充ContentValues的数据时,联系人姓名的Key并不是“name”,而是“tag”;
示例代码如下:
ContentResolver contentResolver = getContentResolver();
ContentValues contentValues =new ContentValues();
contentValues.put("tag","test");
contentValues.put("number","123");
Uri insertUri = contentResolver.insert(simUri,contentValues);
1.3 删除联系人
支持条件删除,可以用index字段作为条件。
注意:
1.清除SIM卡联系人,再添加新的联系人到SIM卡,index并不会一直递增,而是复用;同样,_id字段也是复用的。
1.4 修改联系人
在修改联系人时,IccProvider需要通过原来的姓名和电话号码来匹配要更新的联系人,因此,除了指定更新后的姓名和电话号码之外,还需要指定原来的姓名和电话号码。
示例代码如下:
ContentResolver contentResolver = getContentResolver();
ContentValues contentValues =new ContentValues();
contentValues.put("tag","test");
contentValues.put("number","123");
contentValues.put("newTag","update");
contentValues.put("newNumber","456");
int result = contentResolver.update(simUri,contentValues, null,null);
5 IccProvider各操作返回值的定义
调用IccProvider的增删改这些接口时,会返回这些操作的状态信息,这些状态信息的说明在IccProvider.java中定义,如下:
/**
* Error code: success.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_SUCCESS = 1;
/**
* Error code: unkonwn error.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_UNKNOWN = 0;
/**
* Error code: number too long.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_NUMBER_TOO_LONG = -1;
/**
* Error code: text too long.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_TEXT_TOO_LONG = -2;
/**
* Error code: storage full.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_STORAGE_FULL = -3;
/**
* Error code: not ready.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_NOT_READY = -4;
/**
* Error code: password error.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_PASSWORD_ERROR = -5;
/**
* Error code: ANR too long.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_ANR_TOO_LONG = -6;
/**
* Error code: generic failure.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_GENERIC_FAILURE = -10;
/**
* Error code: ADN list not exist.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_ADN_LIST_NOT_EXIST = -11;
/**
* Error code: Email full.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_EMAIL_FULL = -12;
/**
* Error code: Email too long.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_EMAIL_TOO_LONG = -13;
/**
* Error code: ANR save failed.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_ANR_SAVE_FAILURE = -14;
/**
* Error code: wrong ADN format.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_WRONG_ADN_FORMAT = -15;
/**
* Error code: SNE full.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_SNE_FULL = -16;
/**
* Error code: SNE too long.
*
* @internal
*/
publicstatic final int ERROR_ICC_PROVIDER_SNE_TOO_LONG = -17;
- Android SIM卡联系人操作总结
- android操作sim卡联系人信息
- android操作sim卡联系人信息
- sim卡操作联系人
- 关于android中操作sim卡联系人的相关内容
- Android学习之——操作SIM卡联系人
- 关于android中操作sim卡联系人的相关内容
- android读取sim卡联系人
- android读取sim卡联系人
- Android 获取Sim卡联系人
- android读取sim卡联系人
- android 从SIM卡获取联系人信息
- android 从SIM卡获取联系人信息
- android -- sim/usim卡导联系人
- Android lollipop 5.1 读取SIM卡联系人
- android SIM联系人
- Android读取SIM联系人信息
- android SIM联系人(转)
- 使input文本框不可编辑的3种方法
- 导项目
- MFC中的一些数据转换
- Excel插入当前日期
- python中 __name__及__main()__的使用
- Android SIM卡联系人操作总结
- SCRIPT70: 没有权限
- thinkphp5实战系列(一)前期配置
- Git使用
- 表单验证+实现跳转
- js grid renderer用法
- 禁止网站被另存为的几种方法
- 单/多图像显示
- 2017暑假训练第四周周中总结