如何在从Android 6到Android 12的所有版本上使用adb shell命令发送短信?

e7arh2l6  于 2022-12-04  发布在  Shell
关注(0)|答案(4)|浏览(313)

我正在尝试使用adb shell命令发送消息。我在Android 10上发送,但在Android 11上没有。我尝试了所有方法,但没有成功。我找到了Android 11 here的isms服务源代码。我还有2部Android 11手机,当我测试它们时,结果是一样的。为了测试我的shell命令在设备上是否工作,我试了输入命令,它确实是。我读了this,它仍然没有帮助。
我使用的命令:

adb shell service call isms 7 i32 0 s16 "com.android.mms.service" s16 "%number%" s16 "null" s16 "%message%" s16 "null" s16 "null"

此命令的输出:

Result: Parcel(00000000 '....')

有人能帮助我如何在Android 11上使用adb shell命令发送消息吗?
(我在Android 12上试过,结果相同)

cczfrluj

cczfrluj1#

Android 10之后:

adb shell service call isms 5 i32 1 s16 "com.android.mms" s16 "null" s16 "number" s16 "null" s16 "message" s16 "null" s16 "null" i32 0 i64 0

在Android 10之前:

adb shell service call isms 7 i32 1 s16 "com.android.mms" s16 "number" s16 "null" s16 "message" s16 "null" s16 "null"
jv4diomz

jv4diomz2#

对于未来的证明方式--因为数字(5,7)会改变,你最好直接使用isms AIDL。

redfin:/ $ service list | grep isms                                                                                         
104 isms: [com.android.internal.telephony.ISms]

因此,查看ism.aidl(frameworks/base/telephony/java/com/android/internal/telephony/ISms.aidl),您将看到“5”现在是

void sendTextForSubscriber(in int subId, String callingPkg, String callingAttributionTag,
            in String destAddr, in String scAddr, in String text, in PendingIntent sentIntent,
            in PendingIntent deliveryIntent, in boolean persistMessageForNonDefaultSmsApp,
            in long messageId);

所以建议的答案是:

call isms 5 i32 1 s16 "com.android.mms" s16 "null" s16 "number" s16 "null" s16 "message" s16 "null" s16 "null" i32 0 i64 0

基本上是伪造的论点(并不完全正确):

in int subId = 1
String callingPkg = "com.android.mms"
String callingAttributionTag = "null"
in String destAddr = "number"
in String scAddr = "16"
in String text = "text"
in PendingIntent sentIntent ="null" (should be i32 0)
in PendingIntent deliveryIntent = "null" (should be i32 0 also)
in boolean persistMessageForNonDefaultSmsApp = 0 = false, 
in long messageId = 0 (the i64)

如果可以的话,请参考AIDL。它安全得多,并且确保序列化正确的参数。不幸的是,这些参数在不同版本之间经常变化。
(来源:《安卓内部》第二卷(http://NewAndroidBook.com))

crcmnpdw

crcmnpdw3#

如果您只想向模拟器发送一些测试消息,而不想处理adb,则可以通过模拟器本身来完成

moiiocjp

moiiocjp4#

以下代码将使用默认消息传递应用编写SMS消息,但不会发送:adb shell am start -a android.intent.action.SENDTO -d sms:+1234567890 --es sms_body "Test" --ez exit_on_sent false。如果您希望完全在后台发送邮件,这将不会有帮助。

相关问题