短信、通话记录和联系人

在电脑上读取手机里存储的短信、通话记录和联系人。都是可选功能,在手机上允许之前保持关闭。

本页为译文。如与英文版不一致,以英文版为准。 English

有三条命令读取手机里存储的个人数据:sms 读短信,calls 读通话记录,contacts 读保存的联系人。它们都是可选功能,各自需要单独的权限。在你允许之前,手机会返回 NO_PERMISSION。AI 智能体只有在 --tools 里写了名称时才能使用。

开启

在手机上打开 Droidline 的 设置 标签页。每条命令都有自己的卡片:短信、通话记录 和 联系人。在需要的卡片上点 允许,再在 Android 弹出的对话框中允许。如果两次选择了“不允许”,Android 就不再弹出对话框,这时按钮会打开应用信息,你可以在那里手动开启权限。

以后要关闭,点对应卡片上的 应用信息,撤销权限即可。

短信

for m in d.sms(max=5):
    print(m["address"], m["text"])

code = d.sms(contains="验证码", within=300, max=1)
for (const m of await d.sms({ max: 5 })) console.log(m.address, m.text);

const code = await d.sms({ contains: "验证码", within: 300, max: 1 });
foreach (var m in await d.SmsAsync(max: 5))
    Console.WriteLine($"{m.Get<string>("address")} {m.Get<string>("text")}");

var code = await d.SmsAsync(contains: "验证码", within: 300, max: 1);
droidline sms --max 5
droidline sms --contains 验证码 --within 300 --max 1

按时间从新到旧返回。每条短信包含 id、address(号码或发件人名称)、text、time(自 1970 年起的毫秒数,以手机时钟为准)、box(inbox 或 sent)、read 和 mms。

选项作用
boxinbox(默认)、sent 或 all
address只要号码或发件人包含此文字的。忽略空格和 -,所以 138 0013 能找到 138-0013-8000
contains只要正文包含此文字的,不区分大小写
within只要最近这么多秒内的。0(默认)表示不限时间
max最多返回的条数,1 到 500,默认 20

sms 读取短信和彩信中的文字部分,彩信里的图片不包含在内。聊天消息(RCS,在 Google 信息和三星信息中显示为“聊天”)由短信应用自己保存,sms 看不到。这类消息可以用 dump 从屏幕上读取,或通过通知获取。

通话记录

for c in d.calls(type="missed", within=3600):
    print(c["number"], c["name"], c["time"])
for (const c of await d.calls({ type: "missed", within: 3600 })) console.log(c.number, c.name, c.time);
foreach (var c in await d.CallsAsync(type: "missed", within: 3600))
    Console.WriteLine($"{c.Get<string>("number")} {c.Get<string>("name")}");
droidline calls --type missed --within 3600

按时间从新到旧返回。每条通话包含 id、number、name(已保存的联系人名称,没有时为空)、type、time 和 duration(秒)。type 为 incoming、outgoing、missed、rejected、blocked 或 voicemail。

选项作用
typeall(默认)、incoming、outgoing、missed、rejected 或 blocked
number只要号码或已存名称包含此文字的。忽略空格和 -
within只要最近这么多秒内的。0(默认)表示不限时间
max最多返回的条数,1 到 500,默认 20

只列出通过电话应用拨打和接听的通话。即时通讯等其他应用内的语音通话通常不会出现。

联系人

for c in d.contacts("王"):
    print(c["name"], c["numbers"], c["emails"])
for (const c of await d.contacts("王")) console.log(c.name, c.numbers, c.emails);
foreach (var c in await d.ContactsAsync("王"))
    Console.WriteLine($"{c.Get<string>("name")} {string.Join(", ", c.Get<string[]>("numbers")!)}");
droidline contacts 王

按名称排序返回。每个联系人包含 id、name、numbers 和 emails。

选项作用
query只要名称、号码或邮箱包含此文字的联系人,不区分大小写。号码中的空格和 - 会被忽略
max最多返回的条数,1 到 500,默认 50

配合 AI 智能体使用

droidline mcp 即使列出其他所有工具,也会把 sms、calls 和 contacts 留在外面,只加 --read-only 也不会包含它们。请只把智能体需要的写进 --tools:

{
  "mcpServers": {
    "droidline": { "command": "droidline", "args": ["mcp", "--tools", "dump,screenshot,touch,sms"] }
  }
}

把它们放进 batch 的步骤里,如果 --tools 没有写,也会被拒绝。短信里经常有验证码和银行通知,通话记录和联系人涉及其他人的信息,只在任务确实需要时才交给智能体。

测试环境

Android 13。更新的 Android 版本是否会在短信列表中隐藏验证码,还没有确认。