android - 通过 ADB 在 Android 上发送短信

标签 android sms adb

我希望能够在我的 Android 手机连接到我的计算机时使用以下 ADB 命令发送短信

adb shell am start -a android.intent.action.SENDTO -d sms:CCXXXXXXXXXX --es sms_body "SMS BODY GOES HERE" --ez exit_on_sent true
adb shell input keyevent 22
adb shell input keyevent 66

我已经开始工作了,但是在电话上,这会向收件人弹出一条文本消息,其中填写了正文,然后单击发送按钮并返回到您所在的位置。有什么办法可以完全在后台执行此操作,这样它就不会干扰手机上发生的任何事情吗?

最佳答案

简短版:

Android 5 及更早版本(此处为 android 4):

adb shell service call isms 5 s16 "com.android.mms" s16 "+01234567890" s16 "+01SMSCNUMBER" s16 "Hello world !" i32 0 i32 0

Android 5 及更高版本(此处为 android 9):

adb shell service call isms 7 i32 0 s16 "com.android.mms.service" s16 "+1234567890" s16 "null" s16 "Hey\ you\ !" s16 "null" s16 "null"

Isms 方法编号(上面的 5 和 7)可能会随着 android 版本的不同而改变。阅读完整的解释以理解它。


所有安卓版本的完整解释:

是的,它存在!但不能使用此命令,因为这些输入事件在 sleep 模式下被阻止。 此解决方案取决于您的 android 版本,因此我将为您解释几乎所有版本 ...

首先,通过运行检查您是否有服务 isms:

adb shell service check isms
Service isms: found

答案找到了,不错,继续前进。服务主义有各种“选项”,语法是:

service call name_service option args

可以通过键入找到服务名称:

adb shell service list

它将显示很多可用的服务,但有趣的是:

5       isms: [com.android.internal.telephony.ISms]

你可以看到 com.android.internal.telephony.Isms,所以在这个 link 上选择你的 android 版本(通过更改分支),然后导航到:telephony/java/com/android/internal/telephony 并打开 Isms.aidl

剩下的我将使用 android Pie (android 9) 文件 ( link )。

185 线上我们有:

void sendTextForSubscriberWithSelfPermissions(...)

注意:在 android 5 之前,该方法被命名为 sendText(...)

这是接口(interface) ISMS 中的第 7 个声明。所以我们发送短信的选项是数字 7。在声明的顶部有参数的解释。这是一个简短的版本:

  • subId:在 android 5 之后,您要使用的 SIM 卡 0、1 或 2,具体取决于您的 android 版本(例如 0-1 用于 android 9,1-2 用于 android 8)
  • callingPkg :将发送您的短信的包的名称(稍后我会解释如何找到它)
  • destinationAdress : 消息接收者的电话号码
  • scAddress :你的 smsc 只需要在 android 5 和更低版本(后面解释)
  • 部分:您的信息!
  • sendIntends 和 deliveryIntents:你不关心

-> 找到你的包名: 浏览您的应用文件或在 google play 下载 Package Name Viewer,找到您的消息应用程序并复制名称 (com.android...)

-> 找到你的 smsc : 在您的应用程序 -> 设置 -> SMSC 或服务中心或消息中心等中,复制号码显示(不要更改)

就在完成之前,在服务中,字符串由 s16 声明整数和 PendingIntent 由 i32 声明

所以对于我的例子,我们有:

  • 子编号:0
  • 调用包:com.android.mms
  • 目标号码:+01234567890
  • 短信中心:+01000000000
  • 我的文本:世界您好!
  • 我们不关心 sendIntends 和 deliveryIntents,所以我们将 0 设置为默认值。

最后:

Android 5 及更早版本(此处为 android 4):

adb shell service call isms 5 s16 "com.android.mms" s16 "+01234567890" s16 "+01000000000" s16 "Hello world !" i32 0 i32 0

Android 5 及更高版本(此处为 android 9):

adb shell service call isms 7 i32 0 s16 "com.android.mms.service" s16 "+1234567890" s16 "null" s16 "'Hey you !'" s16 "null" s16 "null"

->批处理文件中的示例:

android 4 的 send.bat:

echo off
set num=%1
shift
for /f "tokens=1,* delims= " %%a in ("%*") do set ALL_BUT_FIRST=%%b
echo %ALL_BUT_FIRST%
adb shell service call isms 5 s16 "com.android.mms" s16 "%num%" s16 "+01000000000" s16 "%ALL_BUT_FIRST%" i32 0 i32 0

运行:

send.bat +01234567890 Hey you !

现在告诉我它是否适用于你的 android 版本:)

编辑: 更正了 Alex P. 提供的信息 编辑 2: 使用 Neil 提供的信息进行了更正

关于android - 通过 ADB 在 Android 上发送短信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17580199/

相关文章:

Android:适用于 HTC 智能手机的 ADB 驱动程序

android - 重新启动Youtube Player View (无效无效)

android - Android开发中的平台工具和SDK工具有什么区别?

adb - 无法通过 ADB 启动应用程序我得到 "java.lang.SecurityException: Permission Denial: starting Intent"异常

ubuntu - 将参数发送到shell命令

Android - 如何将文件附加到短信?

eclipse - 我可以指定通过 ADB 发送的意图吗?

android - 如何以编程方式启用或禁用以太网?

java - 如何将数据从一个 Activity 传递到当前可见/Activity Activity ?这是一个很好的共同模式吗?

java - Clickatell 显示已发送到网关,但使用 Java 未收到 SMS?