概述:J2ME访问手机电话簿需要JSR75的支持,下面是一个查找手机电话簿的具体例子,分析请参看代码注释。
/**************************************
* ContactListMid.java
**************************************/
package ui;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.pim.*;
public class ContactListMid extends MIDlet implements CommandListener {
public Display display;
public List bookList;
private Command cmdOK;
private Command cmdExit;
private Ticker ticker;
private String[] phoneBook; //用于保存电话簿类型
public ContactListMid() {
display = Display.getDisplay(this);
//查看手机是否支持JSR75
String v = System.getProperty( "microedition.pim.version" );
if( v != null ){
//支持PIM查找
phoneBook = PIM.getInstance().listPIMLists(PIM.CONTACT_LIST);
}
else {
//不支持PIM查找
Alert alert = new Alert("Error", "PIM not supported!", null, AlertType.ERROR);
alert.setTimeout(Alert.FOREVER);
display.setCurrent(alert);
}
bookList = new List("Phonebook list", Choice.IMPLICIT, phoneBook, null);
ticker = new Ticker("Please choose a phone book.");
cmdOK = new Command("OK", Command.OK, 1);
cmdExit = new Command("Exit", Command.EXIT, 1);
bookList.setTicker(ticker);
bookList.addCommand(cmdOK);
bookList.addCommand(cmdExit);
bookList.setCommandListener(this);
System.out.println("constructor.");
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
System.out.println("Destroy app.");
}
protected void pauseApp() {
System.out.println("Pause app.");
}
protected void startApp() throws MIDletStateChangeException {
display.setCurrent(bookList);
System.out.println("Start app.");
}
public void commandAction(Command c, Displayable d) {
if( c == cmdOK || c == List.SELECT_COMMAND )
{
int i = bookList.getSelectedIndex(); //选择电话簿
ContactListForm cl = new ContactListForm(this, phoneBook[i]);
display.setCurrent(cl);
}
else if(c == cmdExit)
{
try {
destroyApp(false);
} catch (MIDletStateChangeException e) {
e.printStackTrace();
}
notifyDestroyed();
}
}
}
/**************************************
* ContactListForm.java
**************************************/
package ui;
import java.util.Enumeration;
import java.util.Vector;
import javax.microedition.lcdui.*;
import javax.microedition.pim.*;
public class ContactListForm extends Form implements CommandListener {
private ContactListMid md;
private Command cmdBack;
private Command cmdExit;
//Save contacts
private Vector names;
private Vector tels;
private Vector emails;
public ContactListForm(ContactListMid md, String phoneBook) {
super(phoneBook);
this.md = md;
cmdBack = new Command("Back", Command.BACK, 1);
cmdExit = new Command("Exit", Command.EXIT, 1);
addCommand(cmdBack);
addCommand(cmdExit);
setCommandListener(this);
names = new Vector();
tels = new Vector();
emails = new Vector();
new PimVisitThread(phoneBook).start(); //开始电话簿访问线程
}
public void commandAction(Command c, Displayable d) {
if(c == cmdBack)
{
md.display.setCurrent(md.bookList); //返回电话簿选择列表
}
}
public class PimVisitThread extends Thread {
public int contactsNum = 0;
private String bookName;
private String name;
private String tel;
private String email;
public PimVisitThread(String bookName)
{
this.bookName = bookName;
}
public void run()
{
char ch = '~'; //判断标志
try
{
ContactList list = (ContactList) PIM.getInstance().openPIMList(
PIM.CONTACT_LIST, PIM.READ_ONLY, bookName);
for (Enumeration e = list.items(); e.hasMoreElements();)
{
Contact contact = (Contact) e.nextElement();
if(contact.countValues(Contact.FORMATTED_NAME) != 0) //联系人姓名
{
name = contact.getString(Contact.FORMATTED_NAME, 0);
names.setSize(contactsNum);
names.insertElementAt(name, contactsNum);
}
if(contact.countValues(Contact.TEL) != 0) //联系人电话
{
tel = contact.getString(Contact.TEL, 0);
tels.setSize(contactsNum);
tels.insertElementAt(tel, contactsNum);
}
if(contact.countValues(Contact.EMAIL) != 0) //联系人email地址
{
email = contact.getString(Contact.EMAIL, 0);
emails.setSize(contactsNum);
emails.insertElementAt(email, contactsNum);
}
else {
email = null;
}
contactsNum ++;
//为了不占屏幕显示空间,首字母相同的联系人只显示第一条
if(name.charAt(0)!=ch || email!=null)
{
ch = name.charAt(0);
append("/nName: "+ name +"/n");
append("Tel: "+ tel +"/n");
append("Email: "+ email +"/n");
}
else //其他联系人以"."代替
append(".");
}
append("/nTotal contacts:" + contactsNum + "/n");
list.close();
addCommand(cmdSrch);
}
catch (PIMException e) {
e.printStackTrace();
}
}
}
}
上面的代码实现了对手机电话簿的访问及显示,为了不占太多手机屏幕,不同的联系人首字母只显示对应的第一条联系人记录。