ContentProvider 之 写入联系人数据

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

具体步骤如下:

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

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

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

  4. 运行代码

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

    <uses-permission android:name="android.permission.READ_CONTACTS" />

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

activity_contacts.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 代码:


    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 代码:

    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. 运行代码

contact

扫描二维码关注公众号,回复: 14850593 查看本文章

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

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

项目代码地址

  • Java 版:
    https://github.com/BethelDEV/shaguaAndroid/tree/main/javaSource/ContentProviderSample

  • Kotlin 版:
    https://github.com/BethelDEV/shaguaAndroid/tree/main/kotlinSource/ContentProviderSample

猜你喜欢

转载自blog.csdn.net/flyingyajun/article/details/127055642