发送短信数据时,不会调用onReceive

时间:2016-07-05 21:19:31

标签: java android broadcastreceiver sms

我在Android上创建一个应用程序,需要能够允许Android设备使用SmsManager.sendDataMessage()来回发送SMS数据。出于某种原因,当我尝试以这种方式发送数据时,我的短信接收器永远不会得到任何东西。我错过了什么?

以下是发送数据的代码:

wh + w + h

以下是我的短信接收器的代码:

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>

1 个答案:

答案 0 :(得分:2)

同样需要RECEIVE_SMS权限才能接收数据短信。如果您的应用在Marshmallow或更高版本下运行,且targetSdkVersion为23或更高,则您还需要在运行时请求此权限。

即使您已经请求其他短信权限,您仍需要专门请求RECEIVED_SMS。您的应用仅被授予其请求的权限,虽然在询问READ_SMSSEND_SMS时会显示SMS群组,但RECEIVED_SMS将不会被授予,除非它包括在内请求。

还应注意,在应用程序接收数据消息之前,必须具有此权限。您无法从Receiver请求权限,到那时,它无论如何都将为时已晚。您的接收者甚至不会知道有消息。只需将该权限添加到其余SMS权限的请求中即可。