BroadcastReceiver SMS_Received не работает на новых устройствах

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

В приведенном ниже коде приведены основы:

Класс широковещательного приемника, отображающий тост onReceive

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

Простой манифест с регистрацией получателя и разрешениями

 <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" /> 

Приведенный выше код объявляет и регистрирует приемник и имеет соответствующие разрешения. Кроме того, приоритет устанавливается на MAX_INT или 2147483647.

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

Приоритетная проблема

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

На данный момент я совершенно смущен:

  • Зачем им это делать?
  • Как обойти его?

большое спасибо

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

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

Добавьте этот код в свой 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"); } } 

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

Класс 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> ? <?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> 

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