Зарегистрируйте широковещательный приемник с другого широковещательного приемника в Android

В настоящее время у меня есть широковещательный приемник для прослушивания событий состояний вызовов. Я зарегистрировал Broadcast Receiver в AndroidManifest.xml, как показано ниже.

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

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

Работает нормально, пока телефон не перезагружается. После перезагрузки телефона этот вещательный приемник перестает работать. Я знаю, что мне нужно зарегистрировать приемник для прослушивания BOOT_COMPLETED события системы.

То, что я сделал, показано ниже:

<receiver android:name=".api.PhoneCallReceiver">
     <intent-filter>
          <action android:name="android.intent.action.PHONE_STATE" />
     </intent-filter>
     <intent-filter>
          <action android:name="android.intent.action.BOOT_COMPLETED" />
     </intent-filter>
</receiver>

Я также дал разрешение на получение системного события BOOT_COMPLETED.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

но как-то не работает. Я думаю о создании нового широковещательного приемника, который прослушивает только событие BOOT_COMPLETED, но проблема в том, что

Итак, мои вопросы: как я могу запустить этот приемник вещания прослушивателя телефонных звонков при поступлении любого входящего вызова?

Как я могу зарегистрировать широковещательный приемник с другого широковещательного приемника

Нужно ли мне переносить код моего существующего широковещательного приемника в службу, чтобы я мог запустить службу из загрузочного приемника?

Любая помощь будет оценена.


person Rajesh    schedule 13.06.2016    source источник
comment
вы дали разрешение, хорошо, но запрашивали ли вы это разрешение во время выполнения, если вы разрабатываете target =›API23?   -  person Opiatefuchs    schedule 13.06.2016
comment
Текущая targetSdkVersion @Opiatefuchs — 22 для приложения.   -  person Rajesh    schedule 13.06.2016
comment
хорошо, а у вас есть разрешение READ_PHONE_STATE?   -  person Opiatefuchs    schedule 13.06.2016
comment
да. Разрешено READ_PHONE_STATE, и широковещательный приемник работает должным образом, пока телефон не перезагрузится.   -  person Rajesh    schedule 13.06.2016
comment
Это очень хороший вопрос, я никогда не использовал этот случай, так что не знаю. Пробовали прописать ресивер просто внутри onBoot Completed?   -  person Opiatefuchs    schedule 13.06.2016
comment
Нет, я не пробовал это дело. свяжется с вами после проверки   -  person Rajesh    schedule 13.06.2016
comment
Я не могу найти документацию о программной регистрации приемника, который также регистрируется через манифест. Но обычно на получателе, зарегистрированном в манифесте, зарегистрированный получатель получает намерение автоматически, поэтому ваш READ_PHONE_STATE должен работать даже без inBootCompleted...   -  person Opiatefuchs    schedule 13.06.2016
comment
Еще один вопрос: ваша цель — API22, но какой из них установлен на вашем устройстве? Если у вас есть MM, то возможно, что эти разрешения не даются автоматически, и вам нужно сделать это вручную.   -  person Opiatefuchs    schedule 13.06.2016
comment
@Opiatefuchs Спасибо за руководство. Я решил это, зарегистрировав динамический широковещательный приемник.   -  person Rajesh    schedule 13.06.2016
comment
Вы не можете зарегистрировать Receiver непосредственно в Context, переданном в метод onReceive() другого Receiver. И вам не нужно. Вы зарегистрировали его в манифесте. Вам не нужно регистрировать его динамически. Он уже запущен, просто зарегистрировавшись в манифесте. Вот почему он работает до перезагрузки.   -  person Mike M.    schedule 13.06.2016
comment
@МайкМ. тогда почему он не работает после перезагрузки?   -  person Rajesh    schedule 13.06.2016
comment
О, я пропустил эту часть. Я только что видел регистрацию приемника в части приемника. Это абсолютно должно работать. Вы принудительно закрываете приложение перед перезагрузкой?   -  person Mike M.    schedule 13.06.2016
comment
@МайкМ. нет, я не буду принудительно закрывать ваше приложение перед перезагрузкой   -  person Rajesh    schedule 13.06.2016
comment
Как вы определяете, что приемник не работает? Вы тестируете на устройстве или эмуляторе? Под какой версией Android вы работаете?   -  person Mike M.    schedule 13.06.2016
comment
Тестирую на реальном устройстве Lenovo K3 note. Версия ОС 6.0. Я запускаю одно действие, которое показывает контактную информацию из базы данных моего приложения при поступлении любого входящего вызова. Оно работает до тех пор, пока телефон не перезагрузится.   -  person Rajesh    schedule 13.06.2016
comment
Что ж, я не знаю, что вам сказать, кроме как предложить попробовать на другой системе. Если вы видите такое же поведение, ваш код не должен быть настроен так, как я предполагаю. Вы обрабатываете разрешения Marshmallow во время выполнения, если это необходимо? Вы динамически регистрируете Receiver где-либо еще в приложении, которое может быть тем, что на самом деле работает сначала? Вы пытались войти в Receiver, чтобы увидеть, работает ли он вообще, и, возможно, Activity просто не работает? Я не знаю о каких-либо изменениях в 6, которые обязательно вызвали бы описанное поведение, но я проверю это, когда у меня будет шанс.   -  person Mike M.    schedule 13.06.2016


Ответы (1)


Любые другие ответы приветствуются.

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

Ниже приведен код:

AndroidManifest.xml:

<receiver android:name=".api.ServiceStarter">
     <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
     </intent-filter>
</receiver>

BroadcastReceiver:

public class ServiceStarter extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.PHONE_STATE");
        PhoneCallReceiver receiver = new PhoneCallReceiver();
        context.getApplicationContext().registerReceiver(receiver, filter);
    }
}

Вы должны зарегистрировать приемник, используя контекст приложения, как показано ниже:

context.getApplicationContext().registerReceiver(receiver, filter);

вместо

context.registerReceiver(receiver, filter);

В противном случае вы получите следующее исключение:

java.lang.RuntimeException: невозможно запустить приемник com.ecosmob.contactpro.api.ServiceStarter: android.content.ReceiverCallNotAllowedException: компонентам BroadcastReceiver не разрешено регистрироваться для получения намерений

Я надеюсь, что это поможет другим!

person Rajesh    schedule 13.06.2016