无法在诺基亚访问/阅读SIM电话簿

时间:2011-11-30 06:39:50

标签: java-me contacts nokia sim-card jsr75

我正试图访问诺基亚5130c-2 XpressMusic上的手机电话簿和SIM phonenook。 该应用程序运行没有错误,但它只返回电话的电话簿中的数字。当我使用此代码列出可用的电话簿时

String[] all_contact_lists=PIM.getInstance().listPIMLists(PIM.CONTACT_LIST);
它给了我电话簿和SIM卡列表。即 1.电话 2. SIM

我尝试使用此代码明确地从SIM卡读取但它仍然没有返回任何内容(即使我在SIM卡中保存了数字。) 代码:

ContactList clist = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY,
                "SIM");

这是我的完整代码::

import javax.microedition.midlet.*;
import javax.microedition.pim.*;
import com.sun.lwuit.*;
import java.util.*;

public class contacts extends MIDlet
{
    private List my_list=new List();
    private String[] names=null;
    public void startApp()
    {
        Display.init(this);
       Form my_form=new Form("Contacts List");       
       String[] all_contact_lists=PIM.getInstance().listPIMLists(PIM.CONTACT_LIST);
       //Iterate through available phonebooks
       for(int db=0; db<all_contact_lists.length; db++)
       {
        try {
            ContactList clist = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_ONLY,
                    all_contact_lists[db]);
            Enumeration contacts=clist.items();
            while(contacts.hasMoreElements())
            {
                Contact contact=(Contact)contacts.nextElement();
                try{
                    String phone_contact="";
                    names=contact.getStringArray(Contact.NAME, 0);
                    for(int i=0; i<names.length; i++)
                    {
                        if(names[i]!=null)
                            phone_contact+=" "+names[i];
                    }
                    //my_list.addItem(phone_contact);
                    int phone_numbers=contact.countValues(Contact.TEL);
                    if(phone_numbers>0)
                    {
                         String number=contact.getString(Contact.TEL,0);
                        my_list.addItem(phone_contact+":"+number);
                    }
                    else
                    {
                        my_list.addItem(phone_contact);
                    }
                    //clist.removeContact(contact);
                }
                catch (Throwable t) {
            t.printStackTrace();
            }

            }
        } catch (PIMException ex) {
            ex.printStackTrace();
        }
       }
       //my_list.addItem(all_contact_lists);
       my_list.setRenderingPrototype("WWWWWWWWWWWWWWWWWWWW");
       my_form.addComponent(my_list);
       my_form.show();
       }
    public void pauseApp(){}
    public void destroyApp(boolean unconditional){}


}

2 个答案:

答案 0 :(得分:2)

如果您使用电话号码作为文本或致电,则只需一行代码即可。现在很明显,手机软件问题会影响应用程序访问PIM API的方式。此外,如果手机中使用的内存联系人设置设置为SIM(单独),则无法访问手机内存中的联系人,反之亦然,请确保两者都在使用中。如果您还有问题,请尝试此操作

//make a text field in LWUIT that is declared globally

PhnNmbr = new TextField();

//set it to only accept phonenumber

PhnNmbr.setConstraint(TextField.PHONENUMBER);

//tell the user how to access phonebook

PhnNmbr.setHint("Press T9 then 'Search' to search phonebook");

//add a button or command 
//that either sends an sms to
//or calls the number in the text field
//or anything else you want to do with it

当用户按下T9时,TextField被认为是一个LCDUI文本字段,其参数为PHONENUMBER,允许它在Sim和手机内存中搜索联系人,这就是为什么你会注意到搜索命令(通常在底部中心) 。还要确保手机使用的内存设置为手机和模拟。

答案 1 :(得分:1)

PIM javadoc的摘录

  

PIMItems通过字段引用其数据。字段是一个分组   所有具有相似特征的数据值。一个例子   field是TEL,表示该特定字段的数据值   是电话号码。实现PIMItem接口的类   定义该特定类的可能字段(例如,TEL是   在Contact接口中定义为联系人可以的字段   支持)。

     

不需要PIM实现来支持所有可能的实现   实现PIMItem接口的类中定义的字段。这个   是因为没有本地PIM数据库包含定义的所有字段   在这个API中。 PIMItem所属的PIMList决定了什么   PIMItem可以支持和存储的字段(特定的所有PIMItem)   PIMList支持同一组字段)。该     来自特定PIMItem的PIMList.getSupportedFields()方法   PIMList用于找出其中支持的字段   项目。由于并非实际上支持所有可能的字段   特别是PIMItem,应在中检查所有字段的支持情况     项目的PIMList在使用之前使用PIMList.isSupportedField(int)     在任何检索或存储方法中。

     

每个字段都有以下可用信息:

     
      
  • 与Field
  • 关联的零个或多个数据值   
  • Field
  • 的数据值的属性   
  • Field的描述性标签
  •   
  • 与字段
  • 关联的数据的数据类型   

可以在此link读取完整的PIM javadoc。

检查设备是否支持设备上的PIM字段Contact.NAMEContact.TEL。如果没有,则需要调用PIMList.getSupportedFields()以获取设备上支持的字段,并相应地获取该设备的名称和电话号码。如果我没记错,名称的替代字段为Contact.FORMATTED_NAME