문자, 통화 기록, 연락처

폰에 저장된 문자, 통화 기록, 연락처를 PC에서 읽습니다. 모두 선택 기능이며 폰에서 허용하기 전에는 꺼져 있습니다.

번역된 페이지입니다. 영어 문서와 내용이 다르면 영어 문서가 기준입니다. English

폰에 저장된 개인 정보를 읽는 명령이 세 가지 있습니다. 문자는 sms, 통화 기록은 calls, 저장된 연락처는 contacts입니다. 모두 선택 기능이고 권한도 따로 받습니다. 허용하기 전에는 폰이 NO_PERMISSION으로 답하며, AI 에이전트는 --tools에 이름을 넣었을 때만 쓸 수 있습니다.

켜기

폰에서 Droidline의 설정 탭을 여세요. 명령마다 문자, 통화 기록, 연락처 카드가 따로 있습니다. 필요한 카드의 허용을 누르고, 안드로이드가 띄우는 창에서 허용하세요. "허용 안 함"을 두 번 고르면 안드로이드가 더 이상 창을 띄우지 않습니다. 이때는 버튼이 앱 정보를 열어 주므로, 거기서 권한을 직접 켜면 됩니다.

나중에 끄려면 해당 카드의 앱 정보를 눌러 권한을 해제하세요.

문자

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번호나 보낸 사람에 이 글자가 들어간 것만. 공백과 -는 무시하므로 010 1234로 010-1234-5678을 찾습니다
contains본문에 이 글자가 들어간 것만, 대소문자 무시
within최근 이 초 안에 온 것만. 0(기본값)이면 기간 제한 없음
max돌려줄 최대 개수, 1부터 500까지. 기본값 20

sms는 SMS와 MMS의 글자 부분을 읽습니다. MMS의 사진은 빠집니다. 채팅 메시지(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. 더 새로운 안드로이드 버전이 문자 목록에서 인증번호를 가리는지는 아직 확인하지 않았습니다.