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

项目代码地址

相关推荐
编程、小哥哥24 分钟前
python操作mysql
android·python
Couvrir洪荒猛兽1 小时前
Android实训十 数据存储和访问
android
五味香3 小时前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
十二测试录4 小时前
【自动化测试】—— Appium使用保姆教程
android·经验分享·测试工具·程序人生·adb·appium·自动化
Couvrir洪荒猛兽5 小时前
Android实训九 数据存储和访问
android
aloneboyooo6 小时前
Android Studio安装配置
android·ide·android studio
Jacob程序员6 小时前
leaflet绘制室内平面图
android·开发语言·javascript
2401_897907867 小时前
10天学会flutter DAY2 玩转dart 类
android·flutter
m0_748233647 小时前
【PHP】部署和发布PHP网站到IIS服务器
android·服务器·php
Yeats_Liao8 小时前
Spring 定时任务:@Scheduled 注解四大参数解析
android·java·spring