我希望能够使用以下ADB命令在我的Android手机连接到我的电脑时发送短信
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
Run Code Online (Sandbox Code Playgroud)
我有这个工作但是在手机上这将弹出一个短信给收件人,身体填写,然后单击发送按钮,然后返回到你所在的位置.有没有办法在后台完全做到这一点,所以它不会干扰手机上发生的任何事情?
Tak*_*nok 13
精简版 :
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
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
Isms方法编号(上面的5和7)可能会随着android版本而改变.阅读完整的解释以了解它.
所有Android版本的完整解释:
是的它存在!但不使用此命令,因为这些输入事件在睡眠模式下被阻止.这个解决方案取决于你的Android版本,所以我将为几乎所有版本解释你...
1,通过运行检查你是否有服务主义:
adb shell service check isms
Service isms: found
Run Code Online (Sandbox Code Playgroud)
找到答案,好,继续前进.服务主义有各种"选项",语法是:
service call name_service option args
Run Code Online (Sandbox Code Playgroud)
输入以下命令即可找到服务名称:
adb shell service list
Run Code Online (Sandbox Code Playgroud)
它将显示许多可用的服务,但有趣的是:
5 isms: [com.android.internal.telephony.ISms]
Run Code Online (Sandbox Code Playgroud)
你可以看到com.android.internal.telephony.Isms,所以在这个链接上选择你的android版本(通过更改分支),然后导航到:telephony/java/com/android/internal/telephony并打开Isms.aidl
其余的我将采取android Pie(android 9)文件(链接).
在第185行我们有:
void sendTextForSubscriberWithSelfPermissions(...)
注意:在android 5之前,该方法被命名sendText(...).
这是ISMS接口中的第7个声明.因此,我们发送短信的选项是数字7.在声明的顶部,有对参数的解释.这是一个简短的版本:
- >查找您的包名: 浏览您的应用文件或在Google Play上下载包名称查看器,找到您的邮件应用程序并复制名称(com.android ...)
- >找到你的smsc: 在你的应用程序 - >设置 - > SMSC或服务中心或消息中心等,复制数字显示(不要改变它)
就在完成之前,在服务中,字符串由s16和整数以及PendingIntent和i32声明.
所以对于我的例子,我们有:
最后:
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
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)
- >批处理文件中的示例:
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
Run Code Online (Sandbox Code Playgroud)
运行:
send.bat +01234567890 Hey you !
Run Code Online (Sandbox Code Playgroud)
现在告诉我它是否适用于您的Android版:)
编辑:更正了Alex P.给出的信息
代替这个,编写您自己的意图服务,如下所示。在清单中为以下 IntentService 创建一个条目。
String targetPhoneNumber = "XX-XXXXXXX-XXXXXX-XXXX";
SmsToSend targetSms = new SmsToSend();
String urlText = url;
targetSms.setPhoneNumbers(new String[]{targetPhoneNumber});
targetSms.setSmsBody("Help me");
Intent smsIntent = targetSms.convertToIntent(context);
startService(smsIntent);
import java.util.ArrayList;
import android.app.IntentService;
import android.app.PendingIntent;
import android.content.Intent;
public class SendStreamMessage extends IntentService {
public SendStreamMessage() {
super("Sms Sender Intent Service");
}
@Override
protected void onHandleIntent(Intent intent) {
sendSms(intent);
}
private void sendSms(Intent intent) {
try {
SmsToSend smsSend = (SmsToSend) intent
.getParcelableExtra("SMSMessage");
Intent sentIntent = new Intent(SmsDeliveryHandlers.SENT_SMS_ACTION);
PendingIntent sentPI = PendingIntent.getBroadcast(
SendStreamMessage.this, 0, sentIntent, 0);
Intent deliveryIntent = new Intent(
SmsDeliveryHandlers.DELIVERED_SMS_ACTION);
PendingIntent deliverPI = PendingIntent.getBroadcast(
SendStreamMessage.this, 0, deliveryIntent, 0);
android.telephony.SmsManager smsManager = android.telephony.SmsManager
.getDefault();
ArrayList<String> messages = smsManager.divideMessage(smsSend
.getSmsBody());
int smsSize = messages.size();
ArrayList<PendingIntent> sentPiList = new ArrayList<PendingIntent>(
smsSize);
ArrayList<PendingIntent> deliverPiList = new ArrayList<PendingIntent>(
smsSize);
for (int i = 0; i < smsSize; i++) {
sentPiList.add(sentPI);
deliverPiList.add(deliverPI);
}
if (smsSize > 1) {
for (int i = 0; i < smsSend.getPhoneNumbers().length; i++) {
String targetPhoneNumber = smsSend.getPhoneNumbers()[i];
SmsDeliveryHandlers handler = new SmsDeliveryHandlers(
targetPhoneNumber, smsSend.getSmsBody());
try {
smsManager.sendMultipartTextMessage(targetPhoneNumber,
null, messages, sentPiList, deliverPiList);
} catch (Exception ex) {
handler.cleanReceiver();
}
}
} else {
SmsDeliveryHandlers handler;
for (int i = 0; i < smsSend.getPhoneNumbers().length; i++) {
String targetPhoneNumber = smsSend.getPhoneNumbers()[i];
handler = new SmsDeliveryHandlers(targetPhoneNumber,
smsSend.getSmsBody());
try {
smsManager.sendTextMessage(targetPhoneNumber, null,
smsSend.getSmsBody(), sentPI, deliverPI);
} catch (Exception ex) {
handler.cleanReceiver();
}
}
}
} finally {
}
}
}
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
public final class SmsDeliveryHandlers extends BroadcastReceiver {
public static final String SENT_SMS_ACTION = "SENT_SMS_ACTION";
public static final String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
private SmsToSend send;
private Context context;
private Uri sendboxUri;
public SmsDeliveryHandlers(String phoneNumber, String message) {
this(new SmsToSend(message, phoneNumber));
}
public SmsDeliveryHandlers(SmsToSend send) {
this.send = send;
IntentFilter targetFilter = new IntentFilter();
targetFilter.addAction(SENT_SMS_ACTION);
targetFilter.addAction(DELIVERED_SMS_ACTION);
context = MmsLiveApplication.getInstance().getTargetContext();
context.registerReceiver(this, targetFilter);
}
@Override
public void onReceive(Context context, Intent intent) {
if (SENT_SMS_ACTION.equals(intent.getAction())) {
handleSend();
} else if (DELIVERED_SMS_ACTION.equals(intent.getAction())) {
handleDelivery();
}
}
private synchronized void handleSend() {
String address = send.getPhoneNumbers()[0];
ContentResolver contentResolver = context.getContentResolver();
int resultCode = getResultCode();
if(resultCode != Activity.RESULT_OK)
{
cleanReceiver();
}
}
public void cleanReceiver() {
context.unregisterReceiver(this);
}
private void handleDelivery() {
switch (getResultCode()) {
case Activity.RESULT_OK:
// HACK This is a hack to insert the send sms result to the real
// message send table ;)
break;
case Activity.RESULT_CANCELED:
break;
}
cleanReceiver();
}
}
package com.ttech.mmslive.contacts;
import android.content.Context;
import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
public class SmsToSend implements Parcelable{
public static final Parcelable.Creator<SmsToSend> CREATOR = new Parcelable.Creator<SmsToSend>() {
public SmsToSend createFromParcel(Parcel in) {
return new SmsToSend(in);
}
public SmsToSend[] newArray(int size) {
return new SmsToSend[size];
}
};
public SmsToSend()
{
}
public SmsToSend(Parcel in) {
readFromParcel(in);
}
public SmsToSend(String smsBody,String phoneNumber)
{
this.smsBody = smsBody;
phoneNumbers = new String[]{phoneNumber};
}
public Intent convertToIntent(Context targetContext)
{
Intent targetIntent = new Intent(targetContext,SendStreamMessage.class);
targetIntent.putExtra("SMSMessage", this);
return targetIntent;
}
@Override
public int describeContents() {
return 0;
}
private String[] phoneNumbers;
private String smsBody;
public String[] getPhoneNumbers() {
return phoneNumbers;
}
public String getSmsBody() {
return smsBody;
}
public void readFromParcel(Parcel in) {
smsBody = in.readString();
int length = in.readInt();
if(length > 0)
{
phoneNumbers = new String[length];
in.readStringArray(phoneNumbers);
}
}
public void setPhoneNumbers(String[] phoneNumbers) {
this.phoneNumbers = phoneNumbers;
}
public void setSmsBody(String smsBody) {
this.smsBody = smsBody;
}
@Override
public void writeToParcel(Parcel parcel, int params) {
parcel.writeString(smsBody);
if(phoneNumbers != null && phoneNumbers.length > 0)
{
parcel.writeInt(phoneNumbers.length);
parcel.writeStringArray(phoneNumbers);
}
else{
parcel.writeInt(0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21724 次 |
| 最近记录: |