Я пытался получить номер телефона из intent extra с помощью метода onrecieve () для следующего широковещательного приемника, зарегистрированного в файле манифеста.
<intent-filter>
<action android:name = "android.intent.action.PHONE_STATE" />
<action android:name = "android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
Я могу успешно прочитать номер телефона для всех версий, кроме обновленного Android Pie на моем устройстве Pixel 2. Согласно документация, приложению требуется дополнительное разрешение для чтения номера телефона, которое имеет разрешение READ_CALL_LOG и разрешение READ_PHONE_STATE, но даже после разрешения этого разрешения у меня все еще отсутствует разрешение для READ_CALL_LOG, поэтому я не смог прочитать номер телефона. Пожалуйста, помогите мне решить эту проблему.
Убедитесь, что вы предоставили разрешения READ_PHONE_STATE и READ_CALL_LOG во время выполнения в Android 6.0+:
https://developer.android.com/distribute/best-practices/develop/runtime-permissions
Также обратите внимание, что после предоставления этих двух разрешений вы дважды получите действие широковещательного намерения ACTION_PHONE_STATE_CHANGED; один с EXTRA_INCOMING_NUMBER, заполненным номером телефона, а другой с пустым.
Вы можете найти дополнительную информацию здесь:
https://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED
подтвержденный. у второй передачи есть телефонный номер. смешной.
Проблема в том, что READ_CALL_LOG теперь является разрешением, для использования которого требуется исключение. Похоже, они переместили возможность видеть номер телефона для идентификатора вызывающего абонента, чтобы использовать его могли только несколько приложений. Какие-нибудь обходные пути?
Согласно документам, номера телефонов, указанные в трансляции, требуют дополнительных разрешений. потому что это похоже на получение доступа к информации журнала вызовов без запроса.
Restricted access to phone numbers Apps running on Android 9 cannot read phone numbers or phone state without first acquiring the READ_CALL_LOG permission, in addition to the other permissions that your app's use cases require.
Phone numbers associated with incoming and outgoing calls are visible in the phone state broadcast, such as for incoming and outgoing calls and are accessible from the PhoneStateListener class. Without the READ_CALL_LOG permission, however, the phone number field that's provided in PHONE_STATE_CHANGED broadcasts and through PhoneStateListener is empty.
To read phone numbers from phone state, update your app to request the necessary permissions based on your use case:
To read numbers from the PHONE_STATE intent action, you need both the READ_CALL_LOG permission and the READ_PHONE_STATE permission. To read numbers from onCallStateChanged(), you need the READ_CALL_LOG permission only. You don't need the READ_PHONE_STATE permission.
пс. Пожалуйста, проверьте это. В моем Broadcastreciever мне теперь нужен такой ужасный блок:
if (Build.VERSION.SDK_INT >= 26 && intent!=null && intent.getExtras() !=null
&& TextUtils.isEmpty(intent.getExtras().getString("incoming_number"))){
return;
}
Единственная проблема с этим решением может быть при входящем звонке с частного номера. Таким образом, код под блоком не будет работать.
Что возвращается, когда это частный номер. Ты можешь сказать? Это ноль?
Да - он возвращает null. Так что я предполагаю, что у него должен быть какой-то счетчик. Когда первая трансляция идет с нулевым значением, пропустите запуск кода, но запустите код на втором.
С новыми изменениями разрешений Google Play (например, публикация 9 января 2019 г. и Android Pie) ни одно из вышеперечисленных действий больше не работает.
Ваше приложение будет работать локально или если пользователь загрузит APK вручную, но вы больше не сможете обновить приложение в Play Store. Вот часть письма от Google Play.
"Привет, разработчики из Kishor Bapat9! Благодарим вас за то, что связались с командой Google Play по поводу вашего приложения. Ekalipi Call Announcer (ECA), com.ked.ekalipi.tts.
Статус публикации
Статус публикации: отклонено
После проверки ваше приложение было отклонено и не было опубликовано из-за нарушения правил. Если вы отправили обновление, предыдущая версия вашего приложения по-прежнему доступна в Google Play.
Проблема: нарушение политики разрешений. Проверив ваше приложение, мы обнаружили, что оно не соответствует требованиям для использования запрошенных разрешений по следующим причинам:
Основываясь на нашем обзоре, мы обнаружили, что впечатления пользователей от вашего приложения не соответствуют заявленным вами основным функциям (идентификатор вызывающего абонента, обнаружение спама и / или блокировка спама}. Удалите эти разрешения из своего приложения. "
Примечание. Мы специально не запрашивали эти разрешения. Мы даже пробовали по-разному менять описания. CATCH 22 - Если вы укажете разрешение CALL_LOG, Google Play отклонит ваше приложение. Если вы удалите разрешение, вы не сможете получить номер входящего звонка.
Итак, каково же тогда решение? как мы можем опубликовать этот тип приложения в магазине Google Play? Можете ли вы опубликовать свое приложение с этим разрешением.
Любое решение для этого?
Я не понимаю, почему Android изменяет так много вещей от одного выпуска к другому. READ_CALL_LOG не нужен до Pie. Почему они думают, что это необходимо сейчас? Это так скучно...