【发布时间】:2016-07-05 21:19:30
【问题描述】:
我正在 android 上创建一个应用程序,该应用程序需要能够允许 android 设备使用 SmsManager.sendDataMessage() 来回发送 SMS 数据。出于某种原因,当我尝试以这种方式发送数据时,我的短信接收器什么也得不到。我错过了什么?
这是发送数据的代码:
SmsManager sm = SmsManager.getDefault();
sm.sendDataMessage(toPhone, null, (short)8901, message.getBytes(), null, null);
这是我的短信接收器的代码:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class DataReceiver extends BroadcastReceiver
{
private String myMessage;
@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
if (bundle == null) return;
Object[] objs = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[objs.length];
for (int i = 0; i < objs.length; i++)
{
messages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
}
for (SmsMessage currMessage : messages)
{
if (!currMessage.isStatusReportMessage())
{
String messageBody = currMessage.getDisplayMessageBody();
byte[] messageBytes = currMessage.getPdu();
int x = 1 + messageBytes[0] + 19 + 7;
myMessage = new String(messageBytes, x, messageBytes.length - x);
System.out.printf(myMessage);
}
}
}
}
这是我的清单中为接收者准备的内容:
<receiver android:name=".DataReceiver">
<intent-filter>
<action android:name="android.intent.action.DATA_SMS_RECEIVED" />
<data android:scheme="sms" />
<data android:host="localhost" />
<data android:port="8901" />
</intent-filter>
</receiver>
这是我正在使用的权限:
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
【问题讨论】:
-
您需要
RECEIVE_SMS权限。而且,如果您在 Marshmallow 或更高版本下运行,targetSdkVersion>=23,您需要在运行时请求权限。 -
@MikeM。我继续并添加了该权限。我也已经在运行时请求许可。我正在调试应用程序,但由于某种原因,它永远不会进入 onReceive() 函数。
-
好吧,如果没有那个许可,它绝对不会。您是否在安装后至少在您的应用程序中启动了一次
Activity以使其退出已停止 状态?在此之前,您的 Receiver 不会收到广播。你确定你在正确的港口?您可以使用"*"监听所有端口。您确定<receiver>在清单中的正确位置,并且它的name指向正确的类文件?我还建议使用日志打印来检查它是否输入onReceive(),如果不是。对于这样的事情,调试器可能不可靠。 -
您也可以在发送前检查号码和消息。如果您仔细检查了所有内容并且一切正常,您可以创建一个
PendingIntent作为sendDataMessage()中的第五个参数传递,并检查结果以确保它确实被发送。另外,测试一下您是否也能收到常规短信。 -
@MikeM。我已经启动了一项活动以使其脱离停止状态。我以为我应该选择一个随机端口号。我在清单和接收器中设置了 8901。
位于清单的 标记中。该名称指向正确的文件。我还在 onReceive() 函数中放了一条打印语句,它永远不会在 logcat 中弹出。
标签: java android broadcastreceiver sms