获取数组中的联系人列表

get contact list in an array

Cursor c;
        ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
        c=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,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, 2, 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)。但是,我尝试了很多方法来计算 none 它们在工作。

我的问题是如何将 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, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 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,null,null,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[]);