微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取数组中的联系人列表

如何解决获取数组中的联系人列表

Cursor c;
        ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
        c=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.Contacts.disPLAY_NAME+" ASC ");
        int i=0;
        while (c.movetoNext()){
            //get contact list
            String diplayName=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.disPLAY_NAME));
            String number=c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

            //put value into Hashmap
            HashMap<String,String> user_data = new HashMap<>();
            user_data.put(Constant.NAME,diplayName);
            user_data.put(Constant.PHONE_NUMBER,number);
            list.add(user_data);


//            String[] arr = { "1","2","3" };
//            System.out.println(Arrays.toString(arr)); // prints "[1,2,3]"
//            arr = append(arr,"4");
//            System.out.println(Arrays.toString(arr)); // prints "[1,3,4]"
            String[] name = new String []{c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.disPLAY_NAME))};
            Log.d("CONTACTS_NAME",name[0]);
        }

        Log.d("CONTACTS_NAME_ARRAY_LIST",String.valueOf(list));

        c.close();

我从 CONTACTS_NAME 获得输出

04-15 11:39:52.333 7623-7623/com.game.stakes D/CONTACTS_NAME: B

04-15 11:39:52.333 7623-7623/com.game.stakes D/CONTACTS_NAME: Bs

但是,输出不是很有帮助..所以,我尝试了

String[] name = new String []{};
while (c.movetoNext()){
     .....
.  .. . ..
 .. . 

name[i] = displayName;
i++;
}

这次我只是出错

java.lang.Arrayindexoutofboundsexception: length=0; index=0

我以为我可以计算联系人列表 c.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)。但是,我尝试了很多方法来计算它们都不起作用。

我的问题是如何将 displayName 添加到单个数组中?

我不想在 ArrayList 上得到任何答复。因为,我已经使用过它,我想将它们添加Array 而不是 ArrayList

解决方法

String[] name = new String [10000]{};
while (c.moveToNext()){
     .....
.  .. . ..
 .. . 

name[i] = displayName;
i++;
}

Log.d("COUNTS_CONTACTS",Arrays.toString(name));

输出:

[B,Bs,null,.....]

我实际上并没有声明数组大小。所以,当我添加数组大小时。然后,再次打印出来它工作正常。

,

我不建议您猜测您需要的数组大小,原因有两个:

  1. 如果您的应用在拥有超过 10,000 个联系人的设备上运行,它可能会崩溃
  2. 您正在分配一个巨大的字符串数组,即使联系人数量非常少

最好的方法是从 ArrayList(长度灵活)开始,然后将其转换为您需要的 String 数组。

此外,建议为所有查询添加投影,以加快查询速度并减少内存占用。

// Start with an ArrayList as we don't know the size we'll need
List<String> names = new ArrayList<>();

String[] projection = new String[] { Phone.DISPLAY_NAME,Phone.NUMBER};
Cursor c = getContentResolver().query(Phone.CONTENT_URI,projection,DISPLAY_NAME + " ASC ");

while (c.moveToNext()){
    String displayName = c.getString(0);
    String number = c.getString(1);

    names.add(displayName);
    Log.d("CONTACTS_NAME","Found: " + displayName + ",with number " + number);
}

c.close();

// convert the ArrayList to a String array
String[] namesArr = names.toArray(new String[]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。