安卓读取,添加,更新,删除联系人,读取短信

目录

读取联系人

添加联系人

更新联系人

删除联系人

读取短信


读取联系人

安卓可以通过contentResolver来读取联系人表,联系人表的Uri信息是:content://com.android.contacts/data/phones 从而输出联系人信息,

需要相关权限:

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

具体代码如下:

Kotlin 复制代码
    //需要读联系人权限READ_CONTACTS
    @SuppressLint("Range")
    private fun getContact() {
        //查询raw_contacts表获得联系人
        val resolver = contentResolver
        val uri = Uri.parse("content://com.android.contacts/data/phones")
        //查询联系人
        val cursor = resolver.query(uri, null, null, null, null)
        while (cursor!!.moveToNext()) {
            val name =
                cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))
            val number =
                cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
            Log.d(TAG, "联系人:${name}")
            Log.d(TAG, "电话:${number}")
        }
        cursor.close()
    }

输出结构如下:

复制代码
//2023-08-06 17:29:50.535 31719-31719 MainActivity2           com.example.myapplication            D  联系人:张三
//2023-08-06 17:29:50.535 31719-31719 MainActivity2           com.example.myapplication            D  电话:1 (883) 22
//2023-08-06 17:29:50.535 31719-31719 MainActivity2           com.example.myapplication            D  联系人:si li
//2023-08-06 17:29:50.535 31719-31719 MainActivity2           com.example.myapplication            D  电话:10020
//2023-08-06 17:29:50.535 31719-31719 MainActivity2           com.example.myapplication            D  联系人:bo xiao
//2023-08-06 17:29:50.535 31719-31719 MainActivity2           com.example.myapplication            D  电话:10086

添加联系人

同理,使用contentResolver。需要写联系人权限

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

具体代码如下:

Kotlin 复制代码
    private fun insertContact() {
        val resolver = contentResolver
        val values = ContentValues()
        //向raw_contacts表插入空数据,拿到uri
        val uri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI,values)
        //拿到表id
        val id = uri?.let { ContentUris.parseId(it) }
        //插入姓名
        values.clear()
        //put id
        values.put(ContactsContract.Data.RAW_CONTACT_ID,id)
        //put type
        values.put(ContactsContract.Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE)
        //put 值
        values.put(StructuredName.GIVEN_NAME,"xiaohong")
        resolver.insert(ContactsContract.Data.CONTENT_URI,values)

        //插入手机号
        values.clear()
        //put id
        values.put(ContactsContract.Data.RAW_CONTACT_ID,id)
        //put type
        values.put(ContactsContract.Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE)
        //put 值
        values.put(Phone.NUMBER,"15541383234")
        values.put(Phone.TYPE,Phone.TYPE_MOBILE)
        resolver.insert(ContactsContract.Data.CONTENT_URI,values)

        //插入邮箱
        values.clear()
        //put id
        values.put(ContactsContract.Data.RAW_CONTACT_ID,id)
        //put type
        values.put(ContactsContract.Data.MIMETYPE,Email.CONTENT_ITEM_TYPE)
        //put 值
        values.put(Email.DATA,"163@qq.com")
        values.put(Email.TYPE,Email.TYPE_WORK)
        resolver.insert(ContactsContract.Data.CONTENT_URI,values)
    }

运行结果如下:

更新联系人

这里我们是根据手机号码先获取联系人表id,也仅有这种方式,获取id

Kotlin 复制代码
    @SuppressLint("Range")
    private fun getContactByPhone(phone: Long): String? {
        val resolver = contentResolver
        val uri = Uri.parse("content://com.android.contacts/data/phones/filter/$phone")
        val cursor= resolver.query(uri, arrayOf(ContactsContract.Data.CONTACT_ID),null,null,null)
        return if (cursor!!.moveToNext()){
            val id = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID))
            cursor.close()
            id
        }else{
            null
        }
    }

拿到ContactId后,去更新数据

Kotlin 复制代码
    //根据手机号更新
    @SuppressLint("SuspiciousIndentation")
    private fun updateContact() {
    val id  = getContactByPhone(15541383234)
        if(id!=null){
            val values = ContentValues()
            val resolver = contentResolver
            values.put(ContactsContract.Data.MIMETYPE,CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            values.put(CommonDataKinds.StructuredName.GIVEN_NAME,"xiaohong_update")
            resolver.update(ContactsContract.Data.CONTENT_URI, values,"${ContactsContract.Data.CONTACT_ID}=?",
                arrayOf(id)
            )
        }
    }

删除联系人

删除联系人,比较简单,我们可以通过联系人名字,删除

Kotlin 复制代码
    private fun deteleContact() {
        val resolver = contentResolver
        //根据联系人删除
        val ret = resolver.delete(RawContacts.CONTENT_URI, CommonDataKinds.Phone.DISPLAY_NAME+"=?",
            arrayOf("si li")
        )
        if(ret > 0){
            Toast.makeText(this, "删除成功", Toast.LENGTH_LONG).show()
        }
    }

也可以根据联系人手机号删除,具体代码如下:

Kotlin 复制代码
    private fun deteleContact() {
        val resolver = contentResolver
        //根据手机号删除
         val id = getContactByPhone(10020)
         val ret = resolver.delete(RawContacts.CONTENT_URI, CommonDataKinds.Phone.CONTACT_ID+"=?",
            arrayOf(id)
         )
        if(ret > 0){
            Toast.makeText(this, "删除成功", Toast.LENGTH_LONG).show()
        }
    }

读取短信

除此,我们还可以通过contentResolver读取短信信息,短信表的uri信息content://sms/

用途比如验证码快捷输入,像ios短信验证码快速copy到输入框。

下面看看任何实现

第一,读取短信信息,需要权限:

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

具体代码如下;

Kotlin 复制代码
    private fun getMsgs() {
        val uri = Uri.parse("content://sms/")
        val resolver = contentResolver
        val  cursor =resolver.query(uri, arrayOf("address","date","type","body"),null,
        null,null)
        while (cursor!!.moveToNext()){
            val  address = cursor.getString(0)
            val  date = cursor.getString(1)
            val  type = cursor.getString(2)
            val  body = cursor.getString(3)
            Log.d(TAG,"address:${address},date:${date},type:${type},body:${body}")
        }
        cursor.close()
    }

下面是一些表的uri信息:

相关推荐
2501_916007477 小时前
iOS 证书如何创建,从能生成到能长期使用
android·macos·ios·小程序·uni-app·cocoa·iphone
Just_Paranoid8 小时前
【AOSP】Android Dump 信息快速定位方法
android·adb·framework·service·aosp·dumpsys
帅得不敢出门8 小时前
MTK Android11获取真实wifi mac地址
android·mtk
成都大菠萝8 小时前
2-2-16 快速掌握Kotlin-泛型扩展函数
android
I'm Jie8 小时前
Gradle 多模块依赖集中管理方案,Version Catalogs 详解(Kotlin DSL)
android·java·spring boot·kotlin·gradle·maven
BoomHe8 小时前
Android 13 (API 33)开发自己的 Settings ,如何配置 WiFi BT 权限
android
城东米粉儿9 小时前
ConcurrentHashMap实现原理 笔记
android
佳哥的技术分享9 小时前
System.setProperty vs adb setprop (Android SystemProperties)
android·adb
Railshiqian10 小时前
通过adb命令获取某个window或View/子View的绘制内容并输出为png图片的方法
android·adb·dump view
XI锐真的烦10 小时前
新手该如何选择 Android 开发框架?
android