Я создаю приложение на Android, которое должно позволить устройствам Android отправлять SMS-данные взад и вперед с помощью SmsManager.sendDataMessage(). По какой-то причине, когда я пытаюсь отправить данные таким образом, мой sms-приемник ничего не получает. Что мне не хватает?onReceive не получает вызов при отправке 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(). – saboehnke
Ну, без этого разрешения, это определенно никогда не было бы. Вы запустили «Активность» в своем приложении хотя бы один раз после установки, чтобы вывести его из состояния _stopped_? До тех пор ваш приемник не будет доставлять трансляцию. Вы уверены, что находитесь в правильном порту? Вы можете использовать '' * "' для прослушивания на всех портах. Вы уверены, что '' 'в нужном месте манифеста и что его' имя' указывает на правый файл класса? Я также предлагаю использовать лог-печать, чтобы проверить, входит ли она в 'onReceive()', если вы этого не сделали. Отладчики могут быть ненадежными для таких вещей. –