2016-03-13 4 views
6

После прохождения нескольких ресурсов и вопросов у меня по-прежнему возникает проблема с обнаружением входящего SMS-сообщения.BroadcastReceiver SMS_Received не работает на новых устройствах

Приведенный ниже код показывает основы:

Broadcast класс приемника, который отображает тост OnReceive

public class IncomingSms extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "something received", Toast.LENGTH_SHORT).show(); 
    } 
} 

Простой Manifest с регистрацией приемника и разрешения

<application 
    <receiver 
     android:name=".IncomingSms" 
     android:permission="android.permission.BROADCAST_SMS" 
     android:exported="true"> 

     <intent-filter android:priority="2147483647" > 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 

</application> 

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.SEND_SMS" /> 

код, приведенный выше заявляет и регистрирует получателя, и имеет prope r. Кроме того, приоритет установлен на MAX_INT или 2147483647.

Мое устройство Nexus 6P, с установленным по умолчанию программой Messenger (я также пробовал Hangouts). Приложение по-прежнему не показывает мои тосты. Попробовав более старый аппарат Samsung, тосты были напечатаны правильно.

Приоритетный вопрос

Я установил на 6P приложение под названием Manifest просмотра, который позволяет мне видеть manifest.xml приложений, установленных на устройстве. Я проверил манифесты как Messenger, так и Hangouts для получателя SMS-тега и обнаружил, что оба они также указывают приоритет 2147483647. Кажется, что оба этих мессенджера приложения превышают приоритет, и как только они потребляют сообщение, они не позволяют другим приложениям вмешиваться. Обратите внимание, что это акции Google, а не сторонние.

На данный момент, я совершенно запутался,:

  • почему они это делают?
  • Как обходить его?

спасибо

ответ

13

Хорошо, проблема решена. Проблема не была связана с приоритетами, но мой телефон был Nexus 6P (a.k.a. API 23).

Предоставление разрешений только в файле manifest.xml было недостаточно, и мне пришлось добавить код для запроса разрешения на запуск.См Android documentation for runtime permissions

Добавьте этот код в ваш MainActiviy:

ActivityCompat.requestPermissions(this, 
      new String[]{Manifest.permission.RECEIVE_SMS}, 
      MY_PERMISSIONS_REQUEST_SMS_RECEIVE); 

Определить это в верхней части MainActivity Класс:

private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10; 

А также добавить переопределение:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) { 
     // YES!! 
     Log.i("TAG", "MY_PERMISSIONS_REQUEST_SMS_RECEIVE --> YES"); 
    } 
} 
+0

Также получил Nexus 6P. Спасибо, что мне нужно! Спасибо – RJB

+2

Спасибо, большое сообщение, очень полезно. Хотя у меня сложилось впечатление, что проблема больше связана с уровнем API 23, а не с устройством Nexus. И, возможно, вы должны заметить, что последнее переопределение не требуется, просто для копирования кода зомби, как я там ;-) – anhoppe

0

Пожалуйста, убедитесь, что ваша реализация, как это.

SMS класс приемника

public class SmsReceiver extends BroadcastReceiver { 

     private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(SMS_RECEIVED)) { 
       Bundle bundle = intent.getExtras(); 
       if (bundle != null) { 
        // get sms objects 
        Object[] pdus = (Object[]) bundle.get("pdus"); 
        if (pdus.length == 0) { 
         return; 
        } 
        // large message might be broken into many 
        SmsMessage[] messages = new SmsMessage[pdus.length]; 
        StringBuilder sb = new StringBuilder(); 
        for (int i = 0; i < pdus.length; i++) { 
         messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
         sb.append(messages[i].getMessageBody()); 
        } 
        String sender = messages[0].getOriginatingAddress(); 
        String message = sb.toString(); 
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); 
        // prevent any other broadcast receivers from receiving broadcast 
        // abortBroadcast(); 
       } 
      } 
     } 
    } 

Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.smsreceiver" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="4" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity 
      // your activity 
     </activity> 
     <receiver android:name="com.example.smsreceiver.SmsReceiver" android:enabled="true"> 
      <intent-filter android:priority="2147483647"> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

Убедитесь, что вы используете свой собственный Defined пакет. пакет, определенный здесь, является фиктивным.

+0

I Would как сначала убедиться, что я обнаружил что-либо в «onReceive», прежде чем вникать в более подробную реализацию , Я попробовал свои фрагменты только для подтверждения, и выхода еще нет. Я по-прежнему считаю, что это связано с приоритетом, установленным в приложениях Nexus. – Khorkhe

+0

Проверьте это руководство, если оно есть, если оно может вам помочь. http://androidexample.com/Incomming_SMS_Broadcast_Receiver_-_Android_Example/index.php?view=article_discription&aid=62&aaid=87 –

+0

ahh, к сожалению, я уже пытался использовать этот ресурс ... – Khorkhe

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