java - 发送短信数据时 onReceive 不会被调用

标签 java android broadcastreceiver 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);
            }
        }
    }
}

以下是我的接收者 list 中的内容:

<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 或更高版本,则您还需要在运行时请求此权限。

即使您已经请求其他 SMS 权限,您仍然需要专门请求 RECEIVED_SMS。您的应用仅被授予其请求的权限,尽管在请求 READ_SMSSEND_SMS 时会显示短信组,但 RECEIVED_SMS 不会被授予除非包含在请求中,否则将被授予。

还应该注意的是,该权限必须在应用程序接收数据消息之前就位。您无法向接收者请求权限,到那时,无论如何都已经太晚了。您的接收者甚至永远不会知道有消息。只需将该权限添加到其余 SMS 权限的请求中即可。

关于java - 发送短信数据时 onReceive 不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38212920/

相关文章:

java - junit 5 运行所有断言,即使有一个失败

java - 了解 DAO 模式和接口(interface)

android - 想要在安装应用程序后仅显示一次对话框

java - audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT) 不起作用

java - 广播 Action : ACTION_CAMERA_BUTTTON

android - 从广播接收器调用电话时出现上下文错误

android - 在 BroadcastReceiver 中使用 getWindowManager()

java - JDBC 程序调用具有复杂输入和输出的存储过程

java - 在 JTable 中显示 HTML

android - 日期索引器问题