首页 > 其他分享 >ContentProvider 之 写入联系人数据

ContentProvider 之 写入联系人数据

时间:2023-11-21 18:32:43浏览次数:39  
标签:CommonDataKinds 联系人 写入 contentValues ContactsContract put ContentProvider Data

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

ContentProvider 之 写入联系人数据_android

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

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

项目代码地址

标签:CommonDataKinds,联系人,写入,contentValues,ContactsContract,put,ContentProvider,Data
From: https://blog.51cto.com/u_16307842/8505824

相关文章

  • Excel读取和写入,pandas
    读取 写入:df.to_excel('data.xlsx',index=False)#index就是在增加一列,作为索引。目前没啥作用,用不到 numpy是不是也能写入不能 ......
  • win10注册表的备份与恢复;对“未将所有数据都成功写入到注册表中。某些项是由系统或其
    为什么要备份注册表呢?现在网络上的软件下载渠道良莠不齐,一不小心就给你一个全家桶服务,而仅仅是通过控制面板将它们卸载是删不干净的,鬼知道它们在电脑的注册表上留下了什么。所以在从不知名网站下载一些软件之前,对注册表进行备份,若出了什么问题,事后对注册表进行恢复是最便捷的方式了......
  • 安装 IIS 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
    在windows中使用命令行方式安装IIS(Web服务器)WindowsServer2022安装IIS报错访问临时文件夹C:\WINDOWS\TEMP\3C读取/写入权限错误:0x80070005,可以使用命令行方式来安装和配置Web服务(IIS)。以下是使用DeploymentImageServicingandManagement(DISM)工具的步骤:1.打......
  • pandas写入和读取数据基本操作
    按行存储数据的二维列表写入数据到Excelimportpandasaspd#定义列表数据data=[['id','姓名','国家'],[1.0,'曹操','魏国'],[2.0,'刘备','蜀国'],[3.0,'孙权','吴国'],[4.0,......
  • Odoo模型_联系人相关
    res.partner(联系人)联系人包括客户的公司以公司的员工、供应商的公司以及公司的员工。res.partner.category(联系人标签)用于给联系的人打标签,也是树形结构,可以设置上级标签,类似产品中的产品类。res.partner.title(联系人称谓)当联系人为个人或者是公司下面的......
  • MATLAB将数据写入Excel表格并添加表头
    MATLAB中写入Excel表格的函数为:xlswrite(filename,data,sheet,Range)其中的函数参数如下:filename:文件名,可以是绝对路径也可以是相对路径data:写入表格文件的数据sheet:写入的工作表,指的是sheet1、sheet2或者自己命名的工作表Range:写入的单元格区域,比如A4,指的是从A4开始写入数......
  • Util应用框架基础(六) - 日志记录(四) - 写入 Exceptionless
    本文是Util应用框架日志记录的第四篇,介绍安装和写入Exceptionless日志系统的配置方法.Exceptionless是一个日志管理系统,使用Asp.NetCore开发,比Seq的模糊搜索能力弱,使用它可能需要一些技巧.Util应用框架目前主要使用Seq和Exceptionless管理日志.你可以从中选择......
  • Util应用框架基础(六) - 日志记录(二) - 写入日志文件
    本文是Util应用框架日志记录的第二篇,介绍写入日志文件的配置方法.概述将日志写入文本文件,不方便查看和管理,但在开发阶段可以作为临时查看日志的手段.日志配置引用Nuget包Nuget包名:Util.Logging.SerilogAddSerilog使用AddSerilog扩展方法启用Serilog日志操作.......
  • Util应用框架基础(六) - 日志记录(三) - 写入 Seq
    本文是Util应用框架日志记录的第三篇,介绍安装和写入Seq日志系统的配置方法.安装SeqSeq是一个日志管理系统,对结构化日志数据拥有强大的模糊搜索能力.Util应用框架目前主要使用Seq和Exceptionless管理日志.你可以从中选择一个合适的.本节介绍使用Docker简单安装Seq......
  • php开发之文件读取、写入
    前言续之前的系列,这里php开发的文件操作的内容读取以及文本写入的部分文件读取代码的实现css代码本系列的php博客都是这个css,名字都是index.css/*css样式初始化*/*{font-family:'Poppins',sans-serif;margin:0;padding:0;box-sizing:border-box......