Подтвердить что ты не робот

PhoneStateListener onMessageWaitingIndicatorChanged() не называется надежно

У меня есть код, который обнаруживает, когда есть новая голосовая почта. Он основан на реализации PhoneStateListener.onMessageWaitingIndicatorChanged() (так что технически он срабатывает только при изменении индикатора MWI, не обязательно для каждой новой голосовой почты).

Он работает отлично в течение многих месяцев до обновления 4.x.x для устройств.

Теперь это работает, когда устройство перезагружается, в противном случае оно очень ненадежно. Я вижу, что значок голосовой почты появляется на панели уведомлений, но журналы отладки в onMWIChanged остаются в силе.

Я знаю, что с 4.x.x существует API-провайдер voicemail. Думая, что это может иметь соединение, я добавил намерения android.intent.action.NEW_VOICEMAIL и android.intent.action.PROVIDER_CHANGED к моему получателю, но они не срабатывают (в моем BroadcastReceiver onReceive) либо (мое приложение minSdkVersion равно 8).

4b9b3361

Ответ 1

Это сообщение от разработчиков Android о API Android 4.0.

http://developer.android.com/about/versions/android-4.0.html

Если вы прокрутите вниз, появится раздел о Поставщиках голосовой почты, где он объясняет:

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

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

http://developer.android.com/reference/android/provider/VoicemailContract.html

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

Ответ 2

Для этого требуется разрешение READ_PHONE_STATE. Хотя, если это сработало, прежде чем вы это сделаете.

См. LISTEN_MESSAGE_WAITING_INDICATOR.