Contacts源码分析(一、概述)

Contacts是Android系统中一个用来管理联系人的应用程序。它可以存储联系人的姓名、电话号码、电子邮件地址、网站地址、社交网络账号等信息,并提供多种方式进行查找、编辑、删除、同步等操作。在Android系统中,Contacts是一个重要的框架应用程序,其他应用程序可以通过它提供的接口来进行联系人相关的操作。

一、源代码结构

Contacts源代码位于Android源代码树中的packages/app/Contacts目录下,它包含了Contacts应用程序的全部源代码和资源文件。其中,代码主要分为以下几个部分:

1.界面部分

Contacts界面部分代码主要位于src/com/android/contacts和res/layout目录中。其中,src/com/android/contacts目录下包含了MainActivity、ContactListActivity、QuickContactActivity等多个Activity代码文件,这些Activity实现了不同的联系人界面功能。res/layout目录下则包含了与之对应的多个XML布局文件,用于定义界面的布局和控件。

2. 数据库部分

Contacts数据库部分代码主要位于src/com/android/providers/contacts目录中,其中,ContactsProvider2.java是Contacts数据库的访问类,它提供了丰富的接口供应用程序进行联系人相关的操作。其他的Java文件则实现了一些数据库相关的辅助功能。

3.逻辑处理部分

Contacts逻辑处理部分代码主要位于src/com/android/contacts/util目录中,其中,ContactsUtils.java是定义了一些联系人相关工具类,比如获取联系人头像、拼音首字母等;PhotoProcessor.java则是用来进行联系人头像的压缩和裁剪。

4.同步部分

Contacts同步部分代码主要位于src/com/android/contacts/sync目录中,其中,AbstractSyncService.java是一个同步服务的抽象类,实现了一些同步相关的接口;SyncManager.java则是用来管理同步服务,它可以在需要时启动同步服务,并更新联系人数据库中的数据。

二、使用方法

Contacts应用程序可以直接运行在Android系统中,用户可以通过它来进行联系人的管理和操作。另外,其他应用程序也可以通过Contacts提供的接口来进行联系人相关的操作。以下是使用Contacts的一些常用方法:

1.获取联系人

可以使用以下代码获取所有联系人的姓名和电话号码:

```java

Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,

null, null, ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " ASC");

if (cursor != null) {

while (cursor.moveToNext()) {

String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));

String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

Log.d(TAG, "name: " + name + ", phoneNumber: " + phoneNumber);

}

cursor.close();

}

```

2.添加联系人

可以使用以下代码向联系人数据库中添加一个联系人:

```java

ContentResolver resolver = getContentResolver();

ArrayList operations = new ArrayList<>();

// 添加联系人

ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI);

builder.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null);

builder.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null);

operations.add(builder.build());

// 添加姓名

builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);

builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0);

builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);

builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "John Doe");

operations.add(builder.build());

// 添加电话号码

builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);

builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0);

builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);

builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "1234567890");

builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);

operations.add(builder.build());

// 执行操作

try {

ContentProviderResult[] results = resolver.applyBatch(ContactsContract.AUTHORITY, operations);

} catch (Exception e) {

e.printStackTrace();

}

```

3.删除联系人

可以使用以下代码删除联系人数据库中的一个联系人:

```java

ContentResolver resolver = getContentResolver();

ArrayList operations = new ArrayList<>();

// 删除联系人数据

Uri uri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactId);

operations.add(ContentProviderOperation.newDelete(uri).build());

// 执行操作

try {

ContentProviderResult[] results = resolver.applyBatch(ContactsContract.AUTHORITY, operations);

} catch (Exception e) {

e.printStackTrace();

}

```

4.编辑联系人

可以使用以下代码编辑联系人数据库中的一个联系人:

```java

ContentResolver resolver = getContentResolver();

ArrayList operations = new ArrayList<>();

// 编辑姓名

Uri uri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, nameDataId);

operations.add(ContentProviderOperation.newUpdate(uri)

.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, "Jane")

.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, "Doe")

.build());

// 编辑电话号码

uri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, phoneDataId);

operations.add(ContentProviderOperation.newUpdate(uri)

.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "0987654321")

.build());

// 执行操作

try {

ContentProviderResult[] results = resolver.applyBatch(ContactsContract.AUTHORITY, operations);

} catch (Exception e) {

e.printStackTrace();

}

```

三、案例说明

1.调用Contacts选择联系人

可以使用以下代码调用Contacts应用程序选择一个联系人:

```java

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

startActivityForResult(intent, REQUEST_CODE_PICK_CONTACT);

```

其中,REQUEST_CODE_PICK_CONTACT是自定义的请求码,用于在onActivityResult()方法中识别返回的结果。

在选择联系人后,可以在onActivityResult()方法中处理返回的结果:

```java

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == REQUEST_CODE_PICK_CONTACT && resultCode == RESULT_OK) {

Uri uri = data.getData();

String[] projection = {

ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,

ContactsContract.CommonDataKinds.Phone.NUMBER

};

Cursor cursor = getContentResolver().query(uri, projection, null, null, null);

if (cursor != null && cursor.moveToFirst()) {

String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));

String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

Log.d(TAG, "name: " + name + ", phoneNumber: " + phoneNumber);

cursor.close();

}

}

}

```

2.使用QuickContactBadge快速查看联系人信息

可以使用QuickContactBadge控件在应用程序中快速查看联系人信息。以下是使用QuickContactBadge的示例代码:

```xml

android:id="@+id/quick_contact_badge"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:layout_marginTop="16dp"

android:contentDescription="@string/contact_details"

android:layout_marginBottom="8dp"

android:padding="8dp"

android:background="?attr/selectableItemBackgroundBorderless" />

```

```java

QuickContactBadge quickContactBadge = findViewById(R.id.quick_contact_badge);

String[] projection = {

ContactsContract.Contacts.LOOKUP_KEY,

ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,

ContactsContract.Contacts.DISPLAY_NAME_PRIMARY

};

String selection = ContactsContract.Contacts._ID + "=?";

String[] selectionArgs = {String.valueOf(contactId)};

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, projection, selection, selectionArgs, null);

if (cursor != null && cursor.moveToFirst()) {

String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));

String photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));

String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));

Uri lookupUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);

quickContactBadge.assignContactUri(lookupUri);

if (photoUri != null) {

quickContactBadge.setImageURI(Uri.parse(photoUri));

} else {

quickContactBadge.setImageToDefault();

}

quickContactBadge.setContentDescription(displayName);

cursor.close();

}

```

以上代码会从联系人数据库中获取联系人信息,并将其显示在QuickContactBadge控件中。用户可以点击该控件,查看联系人的详细信息。

四、总结

Contacts应用程序是Android系统中一个重要的框架应用程序,它提供了丰富的接口供其他应用程序进行联系人相关的操作。本文介绍了Contacts源代码结构、使用方法和一些常用案例,希望能对初学者学习Android开发有所帮助。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(39) 打赏

评论列表 共有 2 条评论

柚花离海 1年前 回复TA

福无双至今日至,祸不单行昨夜行。

派大星我们 1年前 回复TA

我的心就像一座荒岛,我的余生都被俘虏了

立即
投稿
发表
评论
返回
顶部