JSR75 PartII PIM

                                                            JSR75 之 PIM

对PIM这块内容一直没有研究过,所以抽出一天时间,看了看书,写了个样例,算是大概理解其含义和用法了。感觉调试起来还是有很多细节需要注意,比如电话本上某个条目为空的时候,如果去读取电话号码时候,String tel = contact.getString(Contact.TEL, 0),当这个条目是空的时候,会抛出异常,所以需要加个异常处理来解决。其他的基本也没啥难的,但比FCAPI使用起来要繁琐很多。

我觉得PIM的应用价值,主要是对个人信息的导入/导出上,就是 vCardvCalendar相关的应用上。在本文中没有讨论vCard和vCalendar,我想有必要抽空补充上。

以下就是正文了。

 

PIMJ2ME开发者提供了访问目标设备上存储的个人信息的API

PIM共由8个接口和6个类(其中4个异常类)组成,定义在javax.microedition.pim包中。

PIM定义了3种类型的个人信息列表,包括:个人通讯录、日程表和任务表,通常他们都是以本地形式存储在设备上。PIM为每种类型的个人信息列表都提供了如下访问接口。

ContactList接口用于访问设备中的个人通讯录、联系人列表。

EventList接口用于访问日程表。

ToDoList接口用于访问任务表。

3个接口都是PIMList得子接口,PIMList接口定义了访问个人信息列表的公共方法。

 

PIM定义的个人信息列表由一些项目组成,列表类型不同,其中的项目类型也不同。PIM为每种类型的项目都定义如下访问接口。

Contact接口用于访问联系人列表中的项目。

Event接口用于访问日程表中的项目。

ToDo接口用于访问任务表中的项目。

3个接口都是PIMItem得子接口,PIMItem接口定义了访问个人信息项目的公共方法。

 

 

       在使用PIM之前,需要先确定是否支持PIM

System.getProperty(“microedition.pim.version”);

如果不支持,则返回null.

 

实战代码

(这里是获取电话本中信息,其他类型数据过程类似)public class GetPIM implements Runnable { public void run() { String[] listNames = PIM.getInstance().listPIMLists(PIM.CONTACT_LIST); int size = listNames.length; String name = null; //获取联系人列表名称: form.append("****信息列表名称****/t"); for (int i = 0; i < size; i++) { System.out.println(listNames[i] + "/n"); form.append(listNames[i]); name = listNames[i]; try { list = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE, name); int[] supportFields = list.getSupportedFields(); int fieldSize = supportFields.length; form.append("/n***支持字段个数****/t" + fieldSize); for (int j = 0; j < fieldSize; j++) { String fieldLabel = list.getFieldLabel(supportFields[j]); // form.append("/n***支持的字段名称****/n"+j+"./t"+fieldLabel); allLabel.addElement(fieldLabel); int fieldType = list.getFieldDataType(supportFields[j]); // form.append("/n***支持的类型****/n"+j+"./t"+fieldType); allType.addElement(new Integer(fieldType)); } //遍历电话本中所有条目: Enumeration items = list.items(); while (items.hasMoreElements()) { form.append("/n****添加数据****/n"); Contact contact = (Contact) items.nextElement(); //添加电话: //try-catch 语句是防止某个条目没有内容,从而会抛出InvalidIndex的异常,使得程序无法继续。 try { String tel = contact.getString(Contact.TEL, 0); if (tel != null) { form.append("电话" + tel + "/n"); } } catch (Exception ex) { continue; } //获取联系人姓名 //try-catch 语句是防止某个条目没有内容,从而会抛出InvalidIndex的异常,使得程序无法继续。 try { String[] nameS = contact.getStringArray(Contact.NAME, 0); int nameSize = nameS.length; for (int m = 0; m < nameSize; m++) { if (nameS[m] != null) { form.append(nameS[m] + "/t"); } } } catch (Exception ex) { continue; } } } catch (PIMException e) { form.append("/n异常了" + e.getMessage()); } catch (NullPointerException npe) { form.append("/n异常了" + npe.getMessage()); } catch (Exception e) { form.append("/n异常了" + e.getMessage()); } } } }

     

这是我花了大概1天的时间,写的一个样例,经过调试,在真机上可以运行。

但是有个问题,我暂时没能解决。目前我只能获取存储在手机内存上的电话本信息,无法获取SIM卡上的电话本信息。上网简单搜了下,也没找到答案,我想,或许访问SIM卡这是安全机制不允许的吧。

流程小结:

1. String[] listNames = PIM.getInstance().listPIMLists(PIM.CONTACT_LIST);

获得列表名称,肯能有多个,所以是个数组。

2. ContactList list = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE, name);

根据列表名称,获取列表
3. Enumeration items = list.items();

while (items.hasMoreElements()) {

       Contact contact = (Contact) items.nextElement();

}

遍历列表,获得实际条目。

4. 获得电话号码(其他字段内容类似),需要在while循环里进行

String tel = contact.getString(Contact.TEL, 0);

 

 

 

你可能感兴趣的:(JSR75 PartII PIM)