Приемник не работает, когда приложение убито в Oreo. Почему? - PullRequest
0 голосов
/ 02 июля 2018

Как я могу получить данные входящего сообщения, используя широковещательный приемник в Oreo, он отлично работает до версии Oreo, но я не могу получить в Oreo, я пытаюсь закорочить это с помощью сайта разработчика, но нет здесь приведен любой пример кода для этого ограничения Oreo

Вот мой класс приемника BroadCast

public class SMSReceiver extends BroadcastReceiver


{
String sender,message;
public void onReceive(Context context, Intent intent) {

    Bundle myBundle = intent.getExtras();
    SmsMessage[] messages = null;
    String strMessage = "";

    if (myBundle != null) {
        Object[] pdus = (Object[]) myBundle.get("pdus");
        messages = new SmsMessage[pdus.length];

        SmsMessage shortMessage=SmsMessage.createFromPdu((byte[]) pdus[0]);
        for (int i = 0; i < messages.length; i++) {
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            sender=messages[i].getOriginatingAddress();

            String message =shortMessage.getMessageBody();



        Toast.makeText(context, sender+"\n"+message, Toast.LENGTH_SHORT).show();


        }

    }

}

а вот и мой манифест

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application
    android:allowBackup="true"
    android:icon="@drawable/logo"
    android:label="@string/app_name"
    android:roundIcon="@drawable/logo"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <receiver android:name=".SMSReceiver" android:enabled="true" android:exported="true">
        <intent-filter
            android:priority="1000"
            >
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>


    </service>

</application>

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Начиная с Android Oreo, большинство приемников Broadcast необходимо регистрировать во время выполнения вместо декларации манифеста.

BroadcastReceiver myReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
        //Do Something
        }

};

Затем зарегистрируйте получателя:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.THE_REQUIRED_ACTION);
registerReceiver(myReceiver, intentFilter);

и отменить регистрацию:

unregisterReceiver(myReceiver);

Вы можете зарегистрировать / отменить регистрацию получателей во время выполнения, добавив приведенный выше код к onResume () / onPause () соответственно.

Если вы хотите, чтобы получатель сохранялся, даже если приложение находится в фоновом режиме, вы можете вместо этого зарегистрироваться / отменить регистрацию в своем классе приложения. Если вы хотите, чтобы он сохранялся после выхода пользователя из приложения, вам необходимо зарегистрировать получателя в планировщике сервиса или работы.

0 голосов
/ 02 июля 2018

Я думаю, это может быть потому, что вам также нужно добавить его как разрешение , например:

<receiver
    android:name=".SMSReceiver"
    android:enabled="true"
    android:exported="true"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
    <intent-filter android:priority="1000">
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>
...