ContentProvider 之 写入联系人数据

在项目 ContentProviderSample代码基础上实现写入共享联系人数据的示例,

具体步骤如下:

  1. AndroidManifest.xml中,添加写入联系人数据的权限

  2. 编辑布局文件 activity_contacts.xml,界面上布局三个文本输入框用于填写联系人名称、电话号码和邮箱账号和确认写入按钮。

  3. 编写代码 ContactsActivity,编写申请写入联系人数据的权限和写入操作的实现代码

  4. 运行代码

1. 在AndroidManifest.xml中,添加写入联系人数据的权限

xml 复制代码
    <uses-permission android:name="android.permission.READ_CONTACTS" />

2. 编辑布局文件 activity_contacts.xml,界面上增加三个文本输入框用于填写联系人名称、电话号码和邮箱账号和确认写入按钮。

activity_contacts.xml:

xml 复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="30dp">

    <EditText
        android:id="@+id/nameEt"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:hint="name" />

    <EditText
        android:id="@+id/phoneEt"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:hint="phone"
        android:inputType="phone" />

    <EditText
        android:id="@+id/mailEt"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:hint="email"
        android:inputType="textEmailAddress" />

    <Button
        android:id="@+id/insertBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="insert contact" />

    ......

</LinearLayout>

3. 编写申请写入联系人数据的权限和写入操作的实现代码

编写 ContactsActivity

Java 代码:

java 复制代码
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacts);
        tv = findViewById(R.id.contactsTv);
        nameEt = findViewById(R.id.nameEt);
        phoneEt = findViewById(R.id.phoneEt);
        mailEt = findViewById(R.id.mailEt);
        Button insertBtn = findViewById(R.id.insertBtn);

        insertBtn.setOnClickListener(view -> mayWriteTheContacts());

        mayReadTheContacts();
    }

    private void mayWriteTheContacts() {
        if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.WRITE_CONTACTS
        )
        ) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 202);
        } else {
            writeTheContacts();
        }
    }


    /**
     * 写入联系人数据
     */
    private void writeTheContacts() {
        String name = nameEt.getText().toString();
        String phone = phoneEt.getText().toString();
        String mail = mailEt.getText().toString();
        if (TextUtils.isEmpty(name) || TextUtils.isEmpty(phone)) return;

        // 插入一个空数据,获取其在系统中的 id,接下来插入数据的步骤都需要用到这个 id.
        ContentValues contentValues = new ContentValues();
        Uri contentUri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, contentValues);
        long contentID = ContentUris.parseId(contentUri);

        // 插入联系人的名字
        contentValues.clear();
        contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID);
        contentValues.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
        contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
        getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);

        // 插入电话号码
        contentValues.clear();
        contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID);
        contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
        contentValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
        contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);

        // 插入邮箱
        if (!TextUtils.isEmpty(mail)) {
            contentValues.clear();
            contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID);
            contentValues.put(ContactsContract.CommonDataKinds.Email.DATA, mail);
            contentValues.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
            contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
            getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);
        }
        Toast.makeText(this, " 联系人数据添加完成 ", Toast.LENGTH_SHORT).show();

        // 更新界面
        nameEt.setText("");
        phoneEt.setText("");
        mailEt.setText("");
        // 读取联系人数据,检查一下是否添加成功
        mayReadTheContacts();
    }

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 101:
                ......
                break;
            case 202:
                if (grantResults.length > 0 && PackageManager.PERMISSION_GRANTED == grantResults[0]) {
                    writeTheContacts();
                } else {
                    Toast.makeText(this, " 你拒绝了写联系人权限 ", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
        }
    }

Kotlin 代码:

kotlin 复制代码
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_contacts)
        tv = findViewById(R.id.contactsTv)
        nameEt = findViewById(R.id.nameEt)
        phoneEt = findViewById(R.id.phoneEt)
        mailEt = findViewById(R.id.mailEt)
        val insertBtn = findViewById<Button>(R.id.insertBtn)

        insertBtn.setOnClickListener{
            mayWriteTheContacts()
        }
        mayReadTheContacts()
    }

    private fun mayWriteTheContacts() {
        if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.WRITE_CONTACTS
            )
        ) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.WRITE_CONTACTS),
                202
            )
        } else {
            writeTheContacts()
        }
    }

    /**
     * 写入联系人数据
     */
    private fun writeTheContacts() {
        val name = nameEt.text.toString()
        val phone = phoneEt.text.toString()
        val mail = mailEt.text.toString()
        if (TextUtils.isEmpty(name) || TextUtils.isEmpty(phone)) return

        // 插入一个空数据,获取其在系统中的 id,接下来插入数据的步骤都需要用到这个 id.
        val contentValues = ContentValues()
        val contentUri =
            contentResolver.insert(ContactsContract.RawContacts.CONTENT_URI, contentValues)
        val contentID = ContentUris.parseId(contentUri!!)

        // 插入联系人的名字
        contentValues.clear()
        contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID)
        contentValues.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name)
        contentValues.put(
            ContactsContract.Data.MIMETYPE,
            ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
        )
        contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues)

        // 插入电话号码
        contentValues.clear()
        contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID)
        contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
        contentValues.put(
            ContactsContract.CommonDataKinds.Phone.TYPE,
            ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE
        )
        contentValues.put(
            ContactsContract.Data.MIMETYPE,
            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
        )
        contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues)

        // 插入邮箱
        if (!TextUtils.isEmpty(mail)) {
            contentValues.clear()
            contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID)
            contentValues.put(ContactsContract.CommonDataKinds.Email.DATA, mail)
            contentValues.put(
                ContactsContract.CommonDataKinds.Email.TYPE,
                ContactsContract.CommonDataKinds.Email.TYPE_WORK
            )
            contentValues.put(
                ContactsContract.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
            )
            contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues)
        }
        Toast.makeText(this, " 联系人数据添加完成 ", Toast.LENGTH_SHORT).show()

        // 更新界面
        nameEt.setText("")
        phoneEt.setText("")
        mailEt.setText("")
        // 读取联系人数据,检查一下是否添加成功
        mayReadTheContacts()
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            101 -> {
                ......
            }
            202 ->{
                if (grantResults.isNotEmpty()&& PackageManager.PERMISSION_GRANTED == grantResults[0]) {
                    writeTheContacts()
                } else {
                    Toast.makeText(this, " 你拒绝了写联系人权限 ", Toast.LENGTH_SHORT).show()
                    finish()
                }
            }
        }
    }

4. 运行代码

在文本框中输入信息,点击按钮,执行写入联系人操作,系统提示授权操作,点击允许;

输入数据成功,app 会再次读取联系人数据并显示,此时刚才输入的联系人数据展现在了界面上了,验证了写入联系人操作成功。

项目代码地址

相关推荐
CYRUS STUDIO39 分钟前
ARM64汇编寻址、汇编指令、指令编码方式
android·汇编·arm开发·arm·arm64
weixin_449310841 小时前
高效集成:聚水潭采购数据同步到MySQL
android·数据库·mysql
Zender Han2 小时前
Flutter自定义矩形进度条实现详解
android·flutter·ios
白乐天_n4 小时前
adb:Android调试桥
android·adb
姑苏风8 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
数据猎手小k11 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
你的小1011 小时前
JavaWeb项目-----博客系统
android
风和先行12 小时前
adb 命令查看设备存储占用情况
android·adb
AaVictory.13 小时前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list
似霰14 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder