博客
关于我
Android 手机卫士--获取联系人信息并显示与回显
阅读量:804 次
发布时间:2023-04-17

本文共 4780 字,大约阅读时间需要 15 分钟。

读取系统联系人并实现联系人信息回显

在本文中,详细介绍了如何在Android应用中读取系统联系人信息,并实现联系人信息的回显功能。以下将分为两大部分进行阐述:第一部分介绍如何读取系统联系人信息,第二部分介绍如何实现联系人信息的回显。

一、读取系统联系人信息

在Android系统中,联系人信息是由系统提供的数据,通常存储在两个主要数据库表中:raw_contactsdata。通过使用ContentResolver和Cursor进行数据库查询,可以有效地读取联系人信息。

1. 内容解析器(ContentResolver)

ContentResolver是Android系统中用于与内容提供者进行交互的核心接口。它能够解析不同内容提供者的数据,返回适用于应用的数据格式。

2. 系统联系人数据库结构

  • raw_contacts 表:

    • contact_id:联系人唯一性标识符。
  • data 表:

    • raw_contact_id:外键,用于关联raw_contacts表。
    • data1:存储联系人信息的字段,包含电话号码和联系人名称。
    • mimetype_id:表示数据类型的引用。
  • mimetypes 表:

    • 用于映射数据类型,例如电话号码对应的类型为 vnd.android.cursor.item/phone_v2,联系人名称对应的类型为 vnd.android.cursor.item/name

3. 数据库访问方式

通过ContentResolver进行查询,常用的URI包括:

content://com.android.contacts/raw_contacts
content://com.android.contacts/data

4. 实现步骤

  • 获取ContentResolver对象。
  • 启动查询,获取raw_contacts表中的contact_id
  • 对每个contact_id,查询data表,获取data1mimetype字段。
  • 根据mimetype类型,解析数据,填充到一个哈希表中。
  • 将解析后的数据添加到联系人列表中。
  • 二、联系人信息回显

    在用户点击联系人条目时,需要实现信息的回显。例如,双击第一个条目后,电话号码自动添加。

    1. 实现方法

  • 在ListView的ItemClickListener中获取点击条目的数据。
  • 提取电话号码,作为结果返回。
  • 在结果页面中显示电话号码,并存储到SharedPreferences中。
  • 2. 代码实现

    private ListView lv_contact;
    private List
    > contactList;
    private MyAdapter mAdapter;
    private Handler mHandler;
    private EditText et_phone_number;
    private Button bt_select_number;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contact_list);
    initUI();
    initData();
    }
    private void initUI() {
    lv_contact = (ListView) findViewById(R.id.lv_contact);
    lv_contact.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView
    adapterView, View view, int i, long l) {
    if (mAdapter != null) {
    HashMap
    hashMap = mAdapter.getItem(i);
    String phone = hashMap.get("phone");
    Intent intent = new Intent();
    intent.putExtra("phone", phone);
    setResult(0, intent);
    finish();
    }
    }
    });
    et_phone_number = (EditText) findViewById(R.id.et_phone_number);
    bt_select_number = (Button) findViewById(R.id.bt_select_number);
    bt_select_number.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    Intent intent = new Intent(getApplicationContext(), ContactListActivity.class);
    startActivityForResult(intent, 0);
    }
    });
    }
    private void initData() {
    new Thread() {
    @Override
    public void run() {
    ContentResolver contentResolver = getContentResolver();
    Cursor cursor = contentResolver.query(
    Uri.parse("content://com.android.contacts/raw_contacts"),
    new String[]{"contact_id"},
    null,
    null,
    null
    );
    contactList.clear();
    while (cursor.moveToNext()) {
    String id = cursor.getString(0);
    Cursor indexCursor = contentResolver.query(
    Uri.parse("content://com.android.contacts/data"),
    new String[]{"data1", "mimetype"},
    "raw_contact_id = ?",
    new String[]{id},
    null
    );
    HashMap
    hashMap = new HashMap<>();
    while (indexCursor.moveToNext()) {
    String data = indexCursor.getString(0);
    String type = indexCursor.getString(1);
    if (type.equals("vnd.android.cursor.item/phone_v2")) {
    if (!TextUtils.isEmpty(data)) {
    hashMap.put("phone", data);
    }
    } else if (type.equals("vnd.android.cursor.item/name")) {
    if (!TextUtils.isEmpty(data)) {
    hashMap.put("name", data);
    }
    }
    }
    contactList.add(hashMap);
    indexCursor.close();
    }
    cursor.close();
    mHandler.sendEmptyMessage(0);
    }
    }.start();
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (data != null) {
    String phone = data.getStringExtra("phone");
    phone = phone.replace("-", "").replace(" ", "").trim();
    et_phone_number.setText(phone);
    SpUtil.putString(getApplicationContext(), ConstantValue.CONTACT_PHONE, phone);
    }
    super.onActivityResult(requestCode, resultCode, data);
    }

    三、总结

    通过以上方法,可以实现读取系统联系人信息并实现信息的回显。这种方法不仅满足了基本需求,还通过优化用户体验和数据存储,使得应用更具实用性。这篇文章详细介绍了实现过程中关键的步骤和细节,希望对开发者有所帮助。

    转载地址:http://cxgfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现EM算法(附完整源码)
    查看>>
    Objective-C实现entropy熵算法(附完整源码)
    查看>>
    Objective-C实现euclidean distance欧式距离算法(附完整源码)
    查看>>
    Objective-C实现Euclidean GCD欧几里得最大公约数算法(附完整源码)
    查看>>
    Objective-C实现euclideanDistance欧氏距离算法(附完整源码)
    查看>>
    Objective-C实现euler method欧拉法算法(附完整源码)
    查看>>
    Objective-C实现euler modified变形欧拉法算法(附完整源码)
    查看>>
    Objective-C实现eulerianPath欧拉路径算法(附完整源码)
    查看>>
    Objective-C实现Eulers TotientFunction欧拉函数算法(附完整源码)
    查看>>
    Objective-C实现eulers totient欧拉方程算法(附完整源码)
    查看>>
    Objective-C实现EulersTotient欧拉方程算法(附完整源码)
    查看>>
    Objective-C实现eval函数功能(附完整源码)
    查看>>
    Objective-C实现even_tree偶数树算法(附完整源码)
    查看>>
    Objective-C实现Exceeding words超词(差距是ascii码的距离) 算法(附完整源码)
    查看>>
    Objective-C实现exchange sort交换排序算法(附完整源码)
    查看>>
    Objective-C实现ExponentialSearch指数搜索算法(附完整源码)
    查看>>
    Objective-C实现extended euclidean algorithm扩展欧几里得算法(附完整源码)
    查看>>
    Objective-C实现ExtendedEuclidean扩展欧几里德GCD算法(附完整源码)
    查看>>
    Objective-C实现external sort外排序算法(附完整源码)
    查看>>
    Objective-C实现Factorial digit sum阶乘数字和算法(附完整源码)
    查看>>