Implementing the Address Book module

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:

  1. Create the AddressBook.java class file.

  2. 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;
  3. 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;
        }
  4. 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();
        }
  5. 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.