雾起、夜未央 2016-03-06 05:49 采纳率: 72.7%
浏览 1794
已采纳

android如何获取电话联系人列表,我这样写错在哪

private ReadNameAndNum rnan;
private Thread t1 ;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    callView=View.inflate(this, R.layout.call, null);
    callViewLayer=new LockUtil(this);
    callViewLayer.setLockView(callView);
    callViewLayer.lock();
    callView.findViewById(R.id.callBack).setOnClickListener(this);

    rnan=new ReadNameAndNum();
    t1=new Thread(rnan);
    t1.start();


}
class ReadNameAndNum implements Runnable{
    ContentResolver cr= getContentResolver();
    Cursor c=cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    @Override
    public void run() {
        System.out.println(">>>>>RUN");
        while (c.moveToNext()) {
            int nameFieldColumnIndex= c.getColumnIndex(PhoneLookup.DISPLAY_NAME);
            String contact=c.getString(nameFieldColumnIndex);

            int numberFieldColumnIndex=c.getColumnIndex(PhoneLookup.NUMBER);
            String number=c.getString(numberFieldColumnIndex);

            System.out.println(">>>>>"+contact+">>>>"+number);
        }
        c.close();
    }}

```报错日志
     20:35.177: I/System.out(19335): >>>>>onStart
     03-06 13:20:35.177: I/System.out(19335): >>>>>onResume
      03-06 13:20:37.027: I/System.out(19335): >>>>CallClick
     03-06 13:20:57.297: W/ServiceManager(19335): Permission failure: android.p   ermission.READ_CONTACTS from uid=10104 pid=19335
     03-06 13:20:57.297: E/CheckPermission(19335): Permission Denial: can't read contacts pid=19335, uid=10104
     03-06 13:20:57.307: I/System.out(19335): >>>>>CAllonStart
     03-06 13:20:57.307: I/System.out(19335): >>>>>CAllonResume
     03-06 13:20:57.317: I/System.out(19335): >>>>>RUN
    03-06 13:20:57.317: W/dalvikvm(19335): threadid=16: thread exiting with uncaught exception (group=0x41697898)
     03-06 13:20:57.327: E/AndroidRuntime(19335): FATAL EXCEPTION: Thread-1466
     03-06 13:20:57.327: E/AndroidRuntime(19335): java.lang.NullPointerException
     03-06 13:20:57.327: E/AndroidRuntime(19335):   at com.example.deng_00_lock.AtyCall$ReadNameAndNum.run(AtyCall.java:42)
     03-06 13:20:57.327: E/AndroidRuntime(19335):   at java.lang.Thread.run(Thread.java:841)
     03-06 13:20:57.397: I/Choreographer(19335): Skipped 1207 frames!  The application may be doing too much work on its main thread.


读取权限我也加了,但仍不成功,这里我开了一个线程


  • 写回答

7条回答

  • 幽兰香风远 2016-03-10 01:01
    关注

    private static String uri_rawcontacts = "content://com.android.contacts/raw_contacts";
    private static String uri_contacts_phones = "content://com.android.contacts/data/phones";
    private static String uri_contacts_emails = "content://com.android.contacts/data/emails";
    private String uri_contacts_data = "content://com.android.contacts/data";

    // 查询联系人的信息
    public static List<Map<String, Object>> selectContactsInfo(
            ContentResolver resolver) {
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Cursor contactsCursor = resolver.query(Uri.parse(uri_rawcontacts),
                new String[] { "_id", "display_name" }, null, null, null);
        while (contactsCursor.moveToNext()) {
            Map<String, Object> map = new HashMap<String, Object>();
            int contactsId = contactsCursor.getInt(contactsCursor
                    .getColumnIndex("_id"));
            String displayName = contactsCursor.getString(contactsCursor
                    .getColumnIndex("display_name"));
            map.put("_id", contactsId);
            map.put("display_name", displayName);
    
            // 根据联系人的id去data表获取电话号码的信息
            Cursor phoneCursor = resolver.query(Uri.parse(uri_contacts_phones),
                    new String[] { "raw_contact_id", "data1" },
                    "raw_contact_id=?", new String[] { contactsId + "" }, null);
    
            StringBuilder sb = new StringBuilder();
            while (phoneCursor.moveToNext()) {
                sb.append(phoneCursor.getString(1));
                sb.append("|");
            }
            map.put("phones", sb.toString());
            if (phoneCursor != null) {
                phoneCursor.close();
            }
    
            // 根据联系人的id去data表获取email的信息
            Cursor emailCursor = resolver.query(Uri.parse(uri_contacts_emails),
                    new String[] { "raw_contact_id", "data1" },
                    "raw_contact_id=?", new String[] { contactsId + "" }, null);
    
            StringBuilder sb2 = new StringBuilder();
            while (emailCursor.moveToNext()) {
                sb2.append(emailCursor.getString(1));
                sb2.append("|");
            }
            map.put("emails", sb2.toString());
            if (emailCursor != null) {
                emailCursor.close();
            }
    
            list.add(map);
        }
        if (contactsCursor != null) {
            contactsCursor.close();
        }
        return list;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决