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;

 


原创粉丝点击