Чтение чисел из действия намерения PHONE_STATE android 9 Не работает

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

  <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, поэтому я не смог прочитать номер телефона. Пожалуйста, помогите мне в решении этой проблемы.


person android dev    schedule 08.08.2018    source источник


Ответы (3)


Убедитесь, что вы предоставили разрешения 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

person SDev    schedule 14.08.2018
comment
Я не понимаю, почему андроид изменяет так много вещей от выпуска к другому. READ_CALL_LOG не требовался до Pie. Почему они считают, что это необходимо именно сейчас? Это так скучно... - person Ton; 23.10.2018
comment
подтвержденный. во второй трансляции есть номер телефона. нелепый. - person j2emanue; 26.12.2018
comment
Проблема в том, что READ_CALL_LOG теперь является разрешением, для использования которого требуется исключение. Кажется, они переместили возможность видеть номер телефона для идентификатора вызывающего абонента, чтобы сделать его доступным только для нескольких приложений. Любые обходные пути? - person Steven K; 30.01.2019

С новыми изменениями разрешений 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 отклонит ваше приложение. Если вы удалите разрешение, вы не сможете получить номер входящего вызова.

person Ekalipi Institute    schedule 30.08.2019
comment
так какое же решение тогда? как мы можем опубликовать этот тип приложения в магазине Google Play? Вы можете опубликовать свое приложение с этим разрешением. - person pavel; 22.09.2019
comment
Любое решение для этого? - person RJB; 30.09.2020

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

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

Телефонные номера, связанные с входящими и исходящими вызовами, отображаются в широковещательном сообщении о состоянии телефона, например, для входящих и исходящих вызовов, и доступны из класса PhoneStateListener. Однако без разрешения READ_CALL_LOG поле номера телефона, предоставленное в широковещательных рассылках PHONE_STATE_CHANGED и через PhoneStateListener, будет пустым.

Чтобы считывать телефонные номера из состояния телефона, обновите свое приложение, чтобы запросить необходимые разрешения в зависимости от вашего варианта использования:

Чтобы прочитать номера из действия намерения PHONE_STATE, вам нужны как разрешение READ_CALL_LOG, так и разрешение READ_PHONE_STATE. Чтобы читать номера из onCallStateChanged(), вам нужно только разрешение READ_CALL_LOG. Вам не нужно разрешение READ_PHONE_STATE.

пс. Пожалуйста, проверьте это. В моем Broadcastreciever мне теперь нужен такой ужасный блок:

     if(Build.VERSION.SDK_INT >= 26 && intent!=null && intent.getExtras() !=null 
&& TextUtils.isEmpty(intent.getExtras().getString("incoming_number"))){
                        return;
                    }
person j2emanue    schedule 26.12.2018
comment
Единственная проблема с этим решением может быть при входящем звонке с частного номера. Таким образом, код под блоком не будет выполняться. - person polis; 15.03.2019
comment
Что возвращается, когда это частный номер. Ты можешь сказать? Это нуль? - person j2emanue; 15.03.2019
comment
Да - возвращает ноль. Поэтому я предполагаю, что у него должен быть какой-то счетчик. Когда первая трансляция приходит с нулевым значением, пропустите код, но запустите код на втором. - person polis; 19.03.2019