PIM (Personal Information Management) API 提供統一介面存取裝置本地個人資料:通訊錄、行程、待辦。支援 SIM 卡與遠端資料庫資料,內建 vCard/vCalendar 匯入匯出(Internet 標準格式),具備安全特性防止未授權存取。配套 JSR 75 另一可選包 File Connection 提供檔案系統存取。
javax.microedition.pim| 介面 | 語義 |
|---|---|
| Contact | 單一聯繫人 |
| ContactList | 通訊錄(Contact 集合) |
| Event | 單一行程 |
| EventList | 行程列表 |
| ToDo | 單一待辦 |
| ToDoList | 待辦列表 |
PIM:工廠類,提供 getInstance()、openPIMList()、import/export (vCard/vCalendar)、列表索引等方法。
ContactList addressBook = null;
try {
addressBook = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE);
Contact singleContact = addressBook.createContact();
// 姓名:優先使用格式化姓名欄位
if (addressBook.isSupportedField(Contact.NAME_FORMATTED))
singleContact.addString(Contact.NAME_FORMATTED, PIMItem.ATTR_NONE, "Mrs. Jane Doe");
// 或拆解姓名結構
else if (addressBook.isSupportedArrayElement(Contact.NAME, Contact.NAME_GIVEN)) {
String[] name = new String[addressBook.stringArraySize(Contact.NAME)];
name[Contact.NAME_GIVEN] = "Jane";
name[Contact.NAME_FAMILY] = "Doe";
singleContact.addStringArray(Contact.NAME, PIMItem.ATTR_NONE, name);
}
singleContact.commit(); // 持久化
} catch (PIMException e) { /* 錯誤處理 */ }
finally {
try { if (addressBook != null) addressBook.close(); } catch (PIMException ignore) {}
}
關鍵點:createContact() 建立暫時物件,commit() 才真正寫入;操作完成必須 close() 釋放鎖定。
EventList eventList = (EventList) PIM.getInstance().openPIMList(PIM.EVENT_LIST, PIM.READ_WRITE);
Event singleEvent = eventList.createEvent();
if (eventList.isSupportedField(Event.SUMMARY)) singleEvent.addString(Event.SUMMARY, PIMItem.ATTR_NONE, "Java Training");
if (eventList.isSupportedField(Event.START)) singleEvent.addDate(Event.START, PIMItem.ATTR_NONE, startDate.getTime());
if (eventList.isSupportedField(Event.END)) singleEvent.addDate(Event.END, PIMItem.ATTR_NONE, endDate.getTime());
singleEvent.commit();
eventList.close();
ToDoList tasks = (ToDoList) PIM.getInstance().openPIMList(PIM.TODO_LIST, PIM.READ_WRITE);
ToDo singleTask = tasks.createToDo();
if (tasks.isSupportedField(ToDo.SUMMARY)) singleTask.addString(ToDo.SUMMARY, PIMItem.ATTR_NONE, "Shopping for Halloween");
if (tasks.isSupportedField(ToDo.DUE)) singleTask.addDate(ToDo.DUE, PIMItem.ATTR_NONE, new Date().getTime());
singleTask.commit();
tasks.close();
| 特性 | PIM | RMS |
|---|---|---|
| 實體模型 | Contact/Event/ToDo(語義豐富) | Record = byte[](無語義) |
| 跨裝置存取 | 本機、SIM、遠端資料庫 | 僅本機 |
| 標準互通 | vCard/vCalendar 匯入匯出 | 無標準 |
| 資料解釋 | 標準欄位,跨應用自解析 | 需協議文檔 |
| 查詢效率 | 欄位索引檢索 | 全表掃描 |
addContact())
public void addContact() {
ContactList contacts = null;
try {
contacts = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE);
Contact contact = contacts.createContact();
// 從 UI TextField 取值
if (contacts.isSupportedArrayElement(Contact.NAME, Contact.NAME_GIVEN)) {
String[] name = new String[contacts.stringArraySize(Contact.NAME)];
name[Contact.NAME_GIVEN] = nameField.getString();
contact.addStringArray(Contact.NAME, PIMItem.ATTR_NONE, name);
}
if (contacts.isSupportedField(Contact.TEL))
contact.addString(Contact.TEL, Contact.ATTR_HOME, phoneField.getString());
contact.commit();
} catch (PIMException e) { e.printStackTrace(); }
finally {
try { if (contacts != null) contacts.close(); } catch (PIMException ignore) {}
}
}
Settings → API Selection → 勾選 JSR 75: PIM API。真機選擇同理:必須為支援 JSR 75 的裝置。
Settings → Permissions → 為 ContactList/EventList/ToDoList 分別授予 Read/Write** 權限(或按需最小權限)。真機部署需簽名並配置對應權限描述符。
PIM 以標準化語義模型、vCard/vCalendar 互通、欄位級防護 API、權限模型四大支柱,解決了 J2ME 存取裝置原生個人資料的長期難題。掌握其核心介面與標準流程,並嚴格遵循「檢測→開啟→防護操作→提交→關閉」生命週期,即可構建安全、可移植、深度整合原生體驗的行動應用。