Регистрация приемника вещания от другого приемника вещания в 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 только событие, но проблема в том, что

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

Как я могу зарегистрировать Broadcast Receiver от другого Broadcast Receiver

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

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

 Rajesh13 июн. 2016 г., 12:37
@Opiatefuchs текущая цельSDKVersion составляет 22 для приложения.
 Opiatefuchs13 июн. 2016 г., 12:36
вы дали разрешение, хорошо, но запрашивали ли вы это разрешение во время выполнения, если вы разрабатываете target => API23?
 Rajesh13 июн. 2016 г., 13:59
@MikeM. тогда почему не работает после перезагрузки?
 Opiatefuchs13 июн. 2016 г., 12:53
Это очень хороший вопрос, я никогда не использовал этот случай, поэтому я не знаю. Вы пытались зарегистрировать приемник просто внутри onBoot завершено?
 Mike M.13 июн. 2016 г., 14:13
Как вы определяете, что приемник не работает? Вы тестируете на устройстве или эмуляторе? Под какой версией Android вы работаете?
 Mike M.13 июн. 2016 г., 13:49
Вы не можете зарегистрировать получателя прямо наContext перешел в другоеReceiver«sonReceive() метод. И вам не нужно. Вы зарегистрировали это в манифесте. Вам не нужно регистрировать это динамически. Это уже "началось", просто будучи зарегистрированным в манифесте. Вот почему это работает до перезагрузки.
 Rajesh13 июн. 2016 г., 13:46
@Opiatefuchs Спасибо за руководство. Я решил это, зарегистрировав приемник динамического вещания.
 Opiatefuchs13 июн. 2016 г., 13:11
Я не могу найти никакой документации о регистрации получателя программно, которая также зарегистрирована через манифест. Но обычно на зарегистрированном получателе в манифесте зарегистрированный получатель получает намерение автоматически, поэтому ваш READ_PHONE_STATE должен работать даже без inBootCompleted ...
 Rajesh13 июн. 2016 г., 12:39
Да. READ_PHONE_STATE разрешено, и приемник Broadcast работает, как ожидалось, до перезагрузки телефона
 Opiatefuchs13 июн. 2016 г., 13:14
Еще один вопрос: ваша цель - API22, но который установлен на вашем устройстве? Если у вас есть MM, возможно, что эти разрешения не будут предоставлены автоматически, и вам придется делать это вручную.
 Mike M.13 июн. 2016 г., 14:02
О, я пропустил эту часть. Я только что видел регистрацию приемника в части приемника. Это абсолютно должно работать. Вы принудительно закрываете свое приложение перед перезагрузкой?
 Rajesh13 июн. 2016 г., 14:06
@MikeM. нет, я не закрываю ваше приложение перед перезагрузкой
 Rajesh13 июн. 2016 г., 12:56
Нет, я не пробовал это дело. вернемся к вам после проверки
 Rajesh13 июн. 2016 г., 14:18
Я тестирую на реальном устройстве Lenovo K3 note. Версия Os 6.0. Я запускаю одно действие, которое показывает контактную информацию из базы данных моего приложения при поступлении любого входящего вызова. Оно работает до перезагрузки телефона.
 Opiatefuchs13 июн. 2016 г., 12:37
хорошо, а у вас есть разрешение READ_PHONE_STATE?
 Mike M.13 июн. 2016 г., 14:29
Ну, я не уверен, что вам сказать, кроме как предложить попробовать в другой системе. Если вы видите такое же поведение, то ваш код не должен быть настроен так, как я предполагаю. Обрабатываете ли вы права на выполнение Marshmallow, если это необходимо? Вы динамически регистрируете Receiver где-нибудь еще в приложении, которое может быть тем, что на самом деле выполняется вначале? Вы пытались войти в Receiver, чтобы увидеть, работает ли он вообще, и, возможно,Activity просто терпит неудачу? Я не знаю каких-либо изменений в 6, которые обязательно вызвали бы описанное поведение, но я проверю это, когда у меня будет шанс.

Ответы на вопрос(1)

Решение Вопроса

Я решил это, создав новый приемник Broadcast и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 не разрешается регистрироваться для получения намерений

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

Ваш ответ на вопрос