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 // 添加联系人 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 // 删除联系人数据 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 // 编辑姓名 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: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/
福无双至今日至,祸不单行昨夜行。
我的心就像一座荒岛,我的余生都被俘虏了