AutoJs学习-读写手机联系人

往期文章分享

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣 !!!
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎私我,交流群让学习不再孤单

在这里插入图片描述

本文约5千字,新手阅读需要7分钟,复习需要2分钟收藏随时查阅不再迷路

👉实践过程


/* 本例子中的联系人contact的结构如下:
    {
        number: '13100654321',
        name: '小明',
        city: '北京'
    }
*/
let Phone = android.provider.ContactsContract.CommonDataKinds.Phone;
let ContentValues = android.content.ContentValues;
let ContentUris = android.content.ContentUris;
let ContactsContract = android.provider.ContactsContract;

alert("警告", "将会请求联系人权限。为了保证自己的通讯录不被其他脚本泄漏或破坏,请运行本脚本后手动禁止读写联系人权限。")
// 请求联系人权限
runtime.requestPermissions(["read_contacts", "write_contacts"]);

// insertOrUpdateContact({
//     number: '662377009',
//     name: 'Auto.js Pro',
//     city: '上海'
// });

// 首次运行会出错,因为读写联系人权限还没授予,很正常
log(getAllContacts());

// 根据联系人号码删除联系人
function deleteContact(contact) {
    let contactId = queryContactId(contact.number);
    console.log("删除联系人: id = %s, 内容 = ", contactId, contact);
    if (contactId === undefined) {
        console.warn("失败: 联系人不存在");
        return false;
    }
    context.contentResolver.delete(ContactsContract.Data.CONTENT_URI,
        ContactsContract.Data.RAW_CONTACT_ID + " = " + contactId, null);
    context.contentResolver.delete(ContactsContract.RawContacts.CONTENT_URI,
        "_id = " + contactId, null);
    console.log("成功");
    return true;
}

// 插入或更新联系人
function insertOrUpdateContact(contact) {
    let contactId = queryContactId(contact.number);
    if (contactId === undefined) {
        contactId = insertRawContact();
    }
    console.log("插入联系人: id = %s, 内容 = ", contactId, contact);
    insertContactData(contactId, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE,
        ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.name);
    insertContactData(contactId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE,
        ContactsContract.CommonDataKinds.StructuredPostal.CITY, contact.city);
    insertContactData(contactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
        ContactsContract.CommonDataKinds.Phone.NUMBER, contact.number,
        ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE
    );
    console.log("成功");
    return contactId;
}

// 根据号码查询联系人的ID
function queryContactId(number) {
    let cursor = context.contentResolver.query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.NUMBER + " = '" + number + "' AND "
        + ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'", null, null);
    if (cursor.moveToFirst()) {
        return cursor.getLong(cursor.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));
    }
    return undefined;
}

function insertRawContact() {
    let values = new ContentValues();
    let rawContactUri = context.contentResolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);
    let contactId = ContentUris.parseId(rawContactUri);
    return contactId;
}

function insertContactData(rawContactId, itemType) {
    let values = new ContentValues()
    with (values) {
        put(ContactsContract.Data.RAW_CONTACT_ID, new java.lang.Long(rawContactId));
        put(ContactsContract.Data.MIMETYPE, itemType);
        for (let i = 2; i < arguments.length; i += 2) {
            let key = arguments[i];
            let value = arguments[i + 1];
            if (typeof (value) == 'number') {
                put(key, new java.lang.Long(value));
            } else {
                put(key, value);
            }
        }
    }
    context.contentResolver.insert(ContactsContract.Data.CONTENT_URI, values)
}

// 获取所有联系人
function getAllContacts() {
    let contacts = [];
    let cursor = context.contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    while (cursor.moveToNext()) {
        let contact = {};
        contact.name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        let contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        contact.contactId = contactId;
        //contact.rawContactId = cursor.getLong(cursor.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));
        let phones = context.contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
        if (phones.moveToFirst()) {
            contact.number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        }
        phones.close()
        contacts.push(contact);
    }
    cursor.close()
    return contacts;
}

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻粒儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值