获取数组中的联系人列表
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, .....]
我实际上并没有声明数组大小。所以,当我添加数组大小时。然后,再次打印出来,一切正常。!
我不建议猜测您需要的数组大小,原因有二:
- 如果您的应用在拥有超过 10,000 个联系人的设备上运行,它可能会崩溃
- 你正在分配一个巨大的字符串数组,即使联系人的数量非常少
最好的方法是从 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[]);
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, .....]
我实际上并没有声明数组大小。所以,当我添加数组大小时。然后,再次打印出来,一切正常。!
我不建议猜测您需要的数组大小,原因有二:
- 如果您的应用在拥有超过 10,000 个联系人的设备上运行,它可能会崩溃
- 你正在分配一个巨大的字符串数组,即使联系人的数量非常少
最好的方法是从 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[]);