[新手求助!]获取联系人信息出错!

Scott-Su 2014-07-24 05:23:40
UI:
只在主界面上显示一个ListView。
程序意图:
在代码中,通过ContentResolver查询系统中的联系人数据库,然后获得所有联系人对应的信息(这里只获取姓名和号码),并包装成数据集,在ListView中显示。

MainActivity代码如下:

package com.example.getcontact;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {
private ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

lv = (ListView) findViewById(R.id.lv);
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
Map<String, Object> map;

Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri dataUri = Uri.parse("content://com.android.contacts/data");
ContentResolver resolver = getContentResolver();

Cursor cursor = resolver.query(uri, null, null, null, null);
// 在raw_contacts表中遍历
while (cursor.moveToNext()) {
// 每个Map对象对应一个联系人
map = new HashMap<String, Object>();
String id = cursor.getString(cursor.getColumnIndex("contact_id"));
// 根据在rew_contacts表中的contact_id,在data表中遍历
Cursor dataCursor = resolver.query(dataUri, null, "raw_contact_id=?",
new String[] { id }, null);
// 以下循环为在"raw_contact_id"相同情况下进行,即对同一个id(联系人)进行信息遍历
while (dataCursor.moveToNext()) {
// 判断该行是否为电话类型
if (dataCursor.getString(cursor.getColumnIndex("mimetype"))
.equals("5")) {
String number = dataCursor.getString(dataCursor
.getColumnIndex("data1"));
map.put("number", number);
} else if (dataCursor.getString(cursor.getColumnIndex("mimetype"))
.equals("6")) {
String name = dataCursor.getString(dataCursor
.getColumnIndex("data1"));
map.put("name", name);
}
}
map.put("header", R.drawable.ic_launcher);
data.add(map);
dataCursor.close();
//至此,遍历完一个联系人(一个raw_contact_id)的所有信息
}
cursor.close();
//为ListView配置适配器
setAdapter(lv, data);
}

public void setAdapter(ListView lv, List<Map<String, Object>> data) {

lv.setAdapter(new SimpleAdapter(getApplicationContext(), data,
R.layout.list_item,
new String[] { "header", "name", "number" }, new int[] {
R.id.iv_header, R.id.tv_name, R.id.tv_number }));
}
}



然后是这个:


求前辈指点。
...全文
136 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Scott-Su 2014-07-24
  • 打赏
  • 举报
回复
引用 2 楼 heaimnmn 的回复:
uri地址好像不对,再百度下
是Android版本不同,用的URI也不同吗?还是有的已经不推荐使用了?没有统一的吗?
Scott-Su 2014-07-24
  • 打赏
  • 举报
回复
引用 4 楼 u010659693 的回复:
[quote=引用 3 楼 lionfresh 的回复:] import android.provider.ContactsContract.CommonDataKinds.Phone;加入这个 然后将uri改为uri = Phone.CONTENT_URI; 然后在manifest,xml中加入<uses-permission android:name="android.permission.READ_CONTACTS" />权限
权限我有加。我也又在网上找了获取系统联系人的URI,为什么好多不一样的版本?[/quote] 有的还用这个:ContactsContract.Contacts.CONTENT_URI?
Scott-Su 2014-07-24
  • 打赏
  • 举报
回复
引用 3 楼 lionfresh 的回复:
import android.provider.ContactsContract.CommonDataKinds.Phone;加入这个 然后将uri改为uri = Phone.CONTENT_URI; 然后在manifest,xml中加入<uses-permission android:name="android.permission.READ_CONTACTS" />权限
权限我有加。我也又在网上找了获取系统联系人的URI,为什么好多不一样的版本?
lionfresh 2014-07-24
  • 打赏
  • 举报
回复
import android.provider.ContactsContract.CommonDataKinds.Phone;加入这个 然后将uri改为uri = Phone.CONTENT_URI; 然后在manifest,xml中加入<uses-permission android:name="android.permission.READ_CONTACTS" />权限
哎,真难 2014-07-24
  • 打赏
  • 举报
回复
uri地址好像不对,再百度下
Scott-Su 2014-07-24
  • 打赏
  • 举报
回复
SimpleAdapter 参数 R.layout.list_item有定义。

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧