Android 四大组件之ContentProvider 访问通讯录进行增删改查操作

简介: Android 四大组件之ContentProvider 访问通讯录进行增删改查操作

首先在清单文件和java文件中添加读取通讯录的权限

<!--允许应用程序写出到联系人-->
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <!--允许应用程序读取到联系人-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

运行时权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_CONTACTS}, 1);
            }
        }

之后activity_contact_resover.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ContactResoverActivity"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/et_contact"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <EditText
        android:id="@+id/et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="用户名"
        />
    <EditText
        android:id="@+id/et_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="电话"
        />
    <Button
        android:id="@+id/btn_search"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="搜索"
        />
    <Button
        android:id="@+id/btn_insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="插入"
        />
    <Button
        android:id="@+id/btn_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除"
        />
    <Button
        android:id="@+id/btn_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="更新"
        />
    <Button
        android:id="@+id/btn_search_all"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询所有"
        />
</LinearLayout>

接下里ContactResoverActivity文件,主要注释都已经给出了。

public class ContactResoverActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView et_contact; //显示查询的信息
    private EditText et_username; //用户名
    private EditText et_phone; //电话
    private Button btn_search; //搜索
    private Button btn_insert;//插入
    private Button btn_delete; //删除
    private Button btn_update; //更新
    private Button btn_search_all; //查询所有
    private String selections; //查询条件
    private String[] selection_args; //查询参数
  //要查询的字段
    String[] query_all = new String[]{
            ContactsContract.CommonDataKinds.Identity.RAW_CONTACT_ID, //用户id
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, //联系人姓名
            ContactsContract.CommonDataKinds.Phone.NUMBER //联系人电话
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact_resover);
        et_contact = findViewById(R.id.et_contact);
        et_username = findViewById(R.id.et_username);
        et_phone = findViewById(R.id.et_phone);
        btn_search = findViewById(R.id.btn_search);
        btn_insert = findViewById(R.id.btn_insert);
        btn_delete = findViewById(R.id.btn_delete);
        btn_update = findViewById(R.id.btn_update);
        btn_search_all = findViewById(R.id.btn_search_all);
        btn_search_all.setOnClickListener(this);
        btn_insert.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
        btn_search.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_CONTACTS}, 1);
            }
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_insert:
                String name = et_username.getText().toString();
                String phone = et_phone.getText().toString();
                ContentValues values = new ContentValues();
                Uri uri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
                long rawContentID = ContentUris.parseId(uri);
                if (!name.equals("")) {
                    values.clear();
                    values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContentID);
                    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
                    values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
                    getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
                }
                if (!phone.equals("")) {
                    values.clear();
                    values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContentID);
                    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
                    values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
                    values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
                    getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
                }
                Toast.makeText(this, "插入成功", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_search_all:
              //参数二:表示要查询的字段,如果为null,表示查询所有的字段
                Cursor cursor1 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, query_all, null, null, null);
                printQueryResult(cursor1);
                break;
            case R.id.btn_delete:
                String name1 = et_username.getText().toString();
                if (!name1.equals("")) {
                    getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.Contacts.DISPLAY_NAME + "=?", new String[]{name1});
                    Toast.makeText(this, "删除成功!", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btn_search:
                String name_search = et_username.getText().toString();
                Cursor cursor = getContentName(name_search);
                printQueryResult(cursor);
                break;
            case R.id.btn_update:
                String name_update = et_username.getText().toString();
                String phone_update = et_phone.getText().toString();
                Long rawContactId = 0L;
                ContentResolver resolver = getContentResolver();
                ContentValues values1 = new ContentValues();
                values1.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone_update);
                if (!name_update.equals("")) {
                    Cursor cursor2 = getContentName(name_update);
                    if (cursor2.moveToFirst()) {
                        rawContactId = cursor2.getLong(0);
                    }
                    resolver.update(ContactsContract.Data.CONTENT_URI, values1, "mimetype=? and raw_contact_id=?"
                            , new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, rawContactId + ""});
                    cursor2.close();
                }
                break;
        }
    }
    private Cursor getContentName(String name_search) {
        selections = ContactsContract.Contacts.DISPLAY_NAME + "=?";
        selection_args = new String[]{name_search};
        Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, query_all, selections, selection_args, null);
        return cursor;
    }
    private void printQueryResult(Cursor cursor) {
        if (cursor != null) {
            et_contact.setText("");
            while (cursor.moveToNext()) {
                String ID = cursor.getString(0);
                String stringName = cursor.getString(1);
                String phone = cursor.getString(2);
                et_contact.append("\n联系人ID:" + ID + "\n联系人姓名:" + stringName + "\n联系人电话:" + phone);
            }
        }
        cursor.close();
    }
}

效果如图所示:


目录
相关文章
|
4天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
1月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
76 0
|
1月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
1月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
44 6
|
2月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
170 5
|
2月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
3月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
3月前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。
|
3月前
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
115 3