如何通过命令行向Android模拟器/设备无手动干预动态添加联系人
Android无手动干预自动添加联系人可落地方案
方案一:adb直接调用系统Content Provider插入(兼容性最高,无需VCF)
该方案适配Android 4.0及以上所有官方ROM及主流定制ROM,无需Root权限,仅需设备开启USB调试,全程无弹窗无人工操作,适合批量自动化测试场景。
核心操作步骤(可直接封装为shell/python脚本循环执行):
- 插入空RawContact记录,获取系统生成的唯一raw_contact_id
# Linux/Mac环境直接获取ID raw_contact_id=$(adb shell content insert --uri content://com.android.contacts/raw_contacts --bind account_type:s:nul --bind account_name:s:nul | awk -F '=' '{print $2}') # Windows环境可先执行插入命令,返回值格式为content://com.android.contacts/raw_contacts/xxx,提取末尾的xxx作为raw_contact_id即可
- 插入联系人姓名字段
adb shell content insert --uri content://com.android.contacts/data \ --bind raw_contact_id:i:$raw_contact_id \ --bind mimetype:s:vnd.android.cursor.item/name \ --bind data1:s:"完整姓名" \ --bind data2:s:"姓" \ --bind data3:s:"名"
- 插入联系电话字段
adb shell content insert --uri content://com.android.contacts/data \ --bind raw_contact_id:i:$raw_contact_id \ --bind mimetype:s:vnd.android.cursor.item/phone_v2 \ --bind data1:s:"13800000000" \ --bind data2:i:2
说明:data2字段值对应号码类型,1为家庭电话、2为移动电话、3为工作电话,可按需调整
- 可选插入其他字段(邮箱、公司、地址等)
以邮箱为例:
- 可选插入其他字段(邮箱、公司、地址等)
adb shell content insert --uri content://com.android.contacts/data \ --bind raw_contact_id:i:$raw_contact_id \ --bind mimetype:s:vnd.android.cursor.item/email_v2 \ --bind data1:s:"test@example.com" \ --bind data2:i:1
方案二:VCF导入失效修复方案(针对必须使用VCF文件的场景)
原有VCF导入方案失效的核心原因是Android 10+的分区存储权限限制,系统联系人应用无权限读取公共存储路径下的VCF文件,可通过以下步骤绕过权限限制完成自动导入:
- 将本地VCF文件推送到设备临时目录
adb push ./test_contacts.vcf /data/local/tmp/
- 将VCF文件拷贝到联系人应用私有缓存目录,规避权限限制
adb shell run-as com.android.providers.contacts cp /data/local/tmp/test_contacts.vcf ./cache/
- 调用系统导入接口完成导入
adb shell am start -t "text/x-vcard" -d "file:///data/user/0/com.android.providers.contacts/cache/test_contacts.vcf" -a android.intent.action.VIEW com.android.contacts/.vcard.VCardEntryActivity
说明:部分定制ROM的联系人包名存在差异,若执行失败可查询对应ROM的联系人应用包名替换即可
内容的提问来源于stack exchange,提问作者Kishore Barik
相关产品推荐
相关产品推荐

