发送 SMS 数据时未调用 onReceive
onReceive not getting called when SMS data is sent
我正在 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 或更高版本,您也需要在运行时请求此权限。
即使您已经申请了其他短信权限,您仍然需要专门申请 RECEIVED_SMS
。您的应用仅被授予它请求的那些权限,尽管在请求 READ_SMS
或 SEND_SMS
时会显示 SMS 组,但 RECEIVED_SMS
将不会被授予,除非它包含在请求中。
还应注意,此权限必须在应用程序接收数据消息之前到位。您不能向接收者请求许可,而且到那时,无论如何都已经太晚了。您的接收者甚至都不会知道有一条消息。只需将该权限添加到其余 SMS 权限的请求中即可。
我正在 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 或更高版本,您也需要在运行时请求此权限。
即使您已经申请了其他短信权限,您仍然需要专门申请 RECEIVED_SMS
。您的应用仅被授予它请求的那些权限,尽管在请求 READ_SMS
或 SEND_SMS
时会显示 SMS 组,但 RECEIVED_SMS
将不会被授予,除非它包含在请求中。
还应注意,此权限必须在应用程序接收数据消息之前到位。您不能向接收者请求许可,而且到那时,无论如何都已经太晚了。您的接收者甚至都不会知道有一条消息。只需将该权限添加到其余 SMS 权限的请求中即可。