The Address Book module implements access to the phone book of the device and provides information from the phone book in the format the MIDlet needs. The module consists of one class, which provides methods for abstracting access to the phone book using the PIM API.
To implement the Address Book module:
Create the AddressBook.java class file.
Import the required classes.
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Enumeration; import java.util.Vector; import javax.microedition.pim.Contact; import javax.microedition.pim.ContactList; import javax.microedition.pim.PIM; import javax.microedition.pim.PIMItem;
Obtain all the names from the address book.
/** * * This class provides an abstraction of the address book to * application. It implements the access to the phone address book and * provides information in the form the application needs */ public class AddressBook { /** * This methods get all names from the address book and * corresponding uids. * <p> * This method retrieves full names from the address book and * corresponding unique identifiers (uids) * * @return two vectors: first is vector of names, second is the * vector of corresponding UIDs * @exception Exception - * in case any errors occur while working with address * book */ static public Vector[] getNamesUIDLists() throws Exception { Vector[] namesUIDs = new Vector[2]; namesUIDs[0] = new Vector(); namesUIDs[1] = new Vector(); // get the name of the address book PIM pim = PIM.getInstance(); String listNames[] = pim.listPIMLists(PIM.CONTACT_LIST); if (listNames.length == 0) { throw new RuntimeException("No available Contact lists"); } // list of preferd order of the name fields Vector fieldOrder = new Vector(); fieldOrder.addElement(new Integer(Contact.FORMATTED_NAME)); // For Series40 fieldOrder.addElement(new Integer(Contact.NAME_FAMILY)); fieldOrder.addElement(new Integer(Contact.NAME_GIVEN)); fieldOrder.addElement(new Integer(Contact.NAME)); // fix for (int listIndex = 0; listIndex < listNames.length; listIndex++) { // opent the address book ContactList contactList = (ContactList) pim.openPIMList( PIM.CONTACT_LIST, PIM.READ_ONLY, listNames[listIndex]); // verify that the required UID field is supported if (!contactList.isSupportedField(Contact.UID)) { continue; } Vector supportedFieldOrder = new Vector(); // create the supported list for (int i = 0; i < fieldOrder.size(); i++) { Integer field = (Integer) fieldOrder.elementAt(i); if (contactList.isSupportedField(field.intValue())) { supportedFieldOrder.addElement(field); } } // in case none of the names is supported if (supportedFieldOrder.isEmpty()) { continue; } // get the list of contacts and uids Enumeration items = contactList.items(); while (items.hasMoreElements()) { Contact contact = (Contact) items.nextElement(); try { // try to obtain any supported name String name = null; Enumeration nameFields = supportedFieldOrder.elements(); while (nameFields.hasMoreElements()) { try { int field = ((Integer) nameFields.nextElement()).intValue(); if (field == Contact.NAME) { String[] nameArray = contact.getStringArray(field, 0); if (nameArray != null) { name = nameArray[0]; } } else { name = contact.getString(field, 0); } if (name != null && !"".equals(name)) { break; } else { name = null; } } catch (Exception e) { name = null; } } // this contact does not have a suitable name, continue with the next if (name == null) { continue; } String uid = contact.getString(Contact.UID, 0); namesUIDs[0].addElement(name); namesUIDs[1].addElement(uid); } catch (IndexOutOfBoundsException e) { // Ignore, this is a malformed contact and we'll omit it } } } return namesUIDs; }
Search for vCards in an address book entry.
/** * Get vCard of the address book entry with the particular uid * <p> * Longer description * * @param uid - * unique identifier of the requested address book entry * @return byte array which contains a vCard * @exception Exception - * in case any error occur */ static public byte[] getVCard(String uid) throws Exception { ByteArrayOutputStream os = new ByteArrayOutputStream(); // create a search pattern (based on uid) ContactList contactList = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY); Contact searchPattern = contactList.createContact(); searchPattern.addString(Contact.UID, PIMItem.ATTR_NONE, uid); Enumeration e = contactList.items(searchPattern); // get the first found contact if (e.hasMoreElements()) { Contact contact = (Contact) e.nextElement(); PIM.getInstance().toSerialFormat(contact, os, "UTF-8", "VCARD/2.1"); } else { throw new RuntimeException("No contacts found"); } return os.toByteArray(); }
Save a vCard to the address book.
/** * Saves a vCard to the address book * <p> * Creates a new entry based on the information from the vCard in * the phones address book * * @param vCard - * byte array which contains a vCard * @exception Exception - * in case any errors occur */ static public void setVCard(byte[] vCard) throws Exception { ByteArrayInputStream in = new ByteArrayInputStream(vCard); // get address book entry from the input stream PIMItem[] items = PIM.getInstance().fromSerialFormat(in, "UTF-8"); // takes the first one discards the others ContactList contactList = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, /* PIM.WRITE_ONLY */ PIM.READ_WRITE); Contact newContact = contactList.importContact((Contact) items[0]); newContact.commit(); } }
Now that you have implemented the Address Book module, implement the Storage module.