2016-07-05 2 views
2

Я создаю приложение на 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" /> 
+0

Вам необходимо разрешение «RECEIVE_SMS». И, если вы работаете под Marshmallow или выше, с 'targetSdkVersion'> = 23, вам нужно запросить разрешения во время выполнения. –

+0

@MikeM. Я пошел вперед и добавил это разрешение. Я уже запрашиваю разрешение во время выполнения. Я отлаживаю приложение, и он по какой-то причине по-прежнему никогда не попадает в функцию onReceive(). – saboehnke

+0

Ну, без этого разрешения, это определенно никогда не было бы. Вы запустили «Активность» в своем приложении хотя бы один раз после установки, чтобы вывести его из состояния _stopped_? До тех пор ваш приемник не будет доставлять трансляцию. Вы уверены, что находитесь в правильном порту? Вы можете использовать '' * "' для прослушивания на всех портах. Вы уверены, что '' 'в нужном месте манифеста и что его' имя' указывает на правый файл класса? Я также предлагаю использовать лог-печать, чтобы проверить, входит ли она в 'onReceive()', если вы этого не сделали. Отладчики могут быть ненадежными для таких вещей. –

ответ

2

RECEIVE_SMS Для получения данных необходимо также получить SMS-сообщение. Если ваше приложение работает под Marshmallow или выше, а targetSdkVersion - 23 или больше, вам также нужно будет запросить это разрешение во время выполнения.

Даже если вы уже запрашиваете другие разрешения на СМС, вам все равно необходимо запросить RECEIVED_SMS. Вашему приложению предоставляются только те разрешения, которые он запрашивает, и хотя группа SMS представлена ​​при запросе READ_SMS или SEND_SMS, RECEIVED_SMS не будет предоставлен, если он не включен в запрос.

Следует также отметить, что это разрешение должно быть установлено до того, как приложение получит данные. Вы не можете запрашивать разрешения у получателя, и к тому времени это будет слишком поздно. Ваш приемник никогда не узнает, что есть сообщение. Просто добавьте это разрешение на запрос для остальных разрешений SMS.

Смежные вопросы