Регистрация статического широковещательного приемника в Oreo

Я работаю над проектом, который записывает входящие и исходящие вызовы, но статические широковещательные приемники Oreo (вещательные приемники, зарегистрированные в манифесте) не срабатывают. если я зарегистрируюсь в контексте, трансляция не будет запущена после того, как приложение будет убито.

Я хочу, чтобы вещательный приемник работал, даже если приложение закрыто.

есть ли какой-нибудь способ достичь этого Oreo? или любой другой альтернативный подход для достижения этого? любая помощь будет оценена.

Я регистрируюсь в манифесте, как показано ниже.

<application ...
  ..
    <receiver
            android:name=".PhoneCallReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
</application>

person Jayanth    schedule 02.04.2018    source источник
comment
Не могли бы вы вставить свой код сюда?   -  person Shalu T D    schedule 02.04.2018
comment
Его система ограничена. Я не думаю, что есть способ избежать этого поведения. ознакомьтесь с ограничениями трансляции, если вы еще этого не сделали . если вы используете один из перечисленных Broadcast .   -  person ADM    schedule 02.04.2018
comment
@ShaluTD Я вставил код   -  person Jayanth    schedule 02.04.2018
comment
@ADM, но приложения Truecaller отлично работают на моем телефоне Oreo. он показывает детали вызова до и после завершения каждого вызова.   -  person Jayanth    schedule 02.04.2018
comment
какая информация вам нужна?   -  person Heshan Sandeepa    schedule 02.04.2018
comment
в настоящее время, если пользователь прокручивает и убивает приложение, приемник вещания не срабатывает. вещательный приемник работает только в том случае, если приложение активно или свернуто. Я хочу знать, как я могу заставить его работать, даже если приложение будет убито.   -  person Jayanth    schedule 02.04.2018
comment
нет, я имею в виду, какая информация об исходящих/входящих вызовах вам нужна? Достаточно ли номера для звонка?   -  person Heshan Sandeepa    schedule 02.04.2018
comment
да, это все, что мне нужно только номер телефона   -  person Jayanth    schedule 02.04.2018


Ответы (2)


В Oreo есть некоторые ограничения широковещательной рассылки, он больше не поддерживает регистрацию широковещательных приемников для неявных широковещательных передач в манифесте приложения. И NEW_OUTGOING_CALL — один из них, читайте здесь

Вы можете использовать действие PHONE_STATE для своих целей, так как оно еще не отнесено к категории неявных трансляций.

public class StateReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {
   // will trigger at incoming/outgoing call

    try {
        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
        String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
        String outgoingNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    }
    catch (Exception e){
        e.printStackTrace();
    }
  }
}

В манифесте

        <receiver android:name=".StateReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
        </receiver>

Также вам нужно добавить и проверить разрешение READ_PHONE_STATE

person Heshan Sandeepa    schedule 02.04.2018
comment
это работает, только если приложение живо, как только приложение будет убито, трансляция не будет запущена. я хочу, чтобы он запускался, даже если приложение не работает, как приложение truecaller - person Jayanth; 02.04.2018
comment
PHONE_STATE не относится к этой категории developer.android.com/guide/components/ и я проверил эмулятор 8.1, и он отлично работает, даже когда приложение не работает, хотя у меня нет реального устройства - person Heshan Sandeepa; 02.04.2018
comment
в моем телефоне, если я пролистну и отменю приложение, оно не запускает трансляцию. - person Jayanth; 02.04.2018
comment
мой телефон OnePlus 5t Oreo 8.1 - person Jayanth; 02.04.2018
comment
Я поддержу ваш ответ, плохо приму, как только получу полное решение - person Jayanth; 02.04.2018
comment
@ Джаянт, ты получил ответ на этот вопрос? - person Anjali Tripathi; 10.07.2018
comment
Я проголосовал за этот ответ, и это все, что я обычно делаю, когда нахожу решение, но я просто хотел сказать, что это прекрасно сработало для меня, и мне нравится, насколько это лаконично! - person Andrew Irwin; 13.08.2018
comment
Та же проблема, приемник вещания не срабатывает, я не закрываю приложение, я просто переключаюсь на главный экран и набираю номер. Я хочу поймать трансляцию в точке останова во время отладки. - person Ryan Dooley; 03.09.2018
comment
не работает, когда приложение закрыто из последнего приложения. какие-либо предложения? - person Sagar Nayak; 15.01.2020
comment
@Jayanth, ты нашел какое-нибудь решение для этого? - person Shashank Srivastava; 26.07.2020

Есть некоторые неявные исключения широковещательной рассылки, которые вы можете найти здесь https://developer.android.com/guide/components/broadcast-exceptions и ACTION_NEW_OUTGOING_CALL среди них.

Мой аналогичный ответ здесь: https://stackoverflow.com/a/51354698/1399483

person Kevin Worth    schedule 16.07.2018