Почему этот код не работает на Android 6 зефира Api 23?
Почему этот код не работает на Android 6 зефира Api 23? Это не вызывает исключение, но код в callStateListener не работает.
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
PhoneStateListener callStateListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
//if(logAtive) Log.i(LOG_TAG,incomingNumber + " " + state);
if(state==TelephonyManager.CALL_STATE_RINGING){
Toast.makeText(getApplicationContext(),"Hey, receive your call. Phone is ringing.",
Toast.LENGTH_LONG).show();
}
if(state==TelephonyManager.CALL_STATE_OFFHOOK){
Toast.makeText(getApplicationContext(),"You are in a call. ",
Toast.LENGTH_LONG).show();
}
if(state==TelephonyManager.CALL_STATE_IDLE){
Toast.makeText(getApplicationContext(),"You are in idle state… ",
Toast.LENGTH_LONG).show();
}
}
};
telephonyManager.listen(callStateListener, PhoneStateListener.LISTEN_CALL_STATE);
Разрешения:
<uses-feature android:name="android.hardware.telephony" android:required="true" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />
Он отлично работает в Android 5.1.1, но не в 6 (API Level 23)
4 ответа
Я просто столкнулся с этим и понял это. Это потому, что вы нацелены на Android SDK 23. Если вы измените свой файл манифеста на целевой API 22, он начнет работать, даже если он установлен и работает на устройстве Marshmallow.
Если вы все еще хотите использовать API 23, вам нужно сначала использовать новый API разрешений во время выполнения, чтобы запросить использование разрешений, в противном случае оно просто будет отклонено.
https://developer.android.com/training/permissions/requesting.html
Возможно, у вас нет прав доступа к TelephonyManager
(например READ_PHONE_STATE
).
Согласно документации, когда вы не запрашивали или не получали разрешения, но все еще пытаетесь получить к нему доступ, результат будет пустым, а не исключением, как в прошлом:
Если пользователь отключает разрешения для устаревшего приложения, система автоматически отключает соответствующие функции. Когда приложение пытается выполнить операцию, для которой требуется это разрешение, операция не обязательно вызовет исключение. Вместо этого он может возвращать пустой набор данных, сигнализировать об ошибке или иным образом демонстрировать непредвиденное поведение. Например, если вы запрашиваете календарь без разрешения, метод возвращает пустой набор данных.
Вы должны попросить пользователя предоставить соответствующее разрешение и обработать случаи, когда пользователь уже отказал или отозвал это разрешение и т. Д. Здесь есть подробное описание того, как использовать это разрешение.
Я наблюдал то же самое поведение. Наше приложение отлично работает на леденце и пуху, но не на зефире. Это не имеет ничего общего с разрешениями. На самом деле с тестовым приложением, которое я написал, я просто зашел в настройки и дал разрешения заранее. Проблема в нашем приложении была связана с самим номером телефона, который поступил из внешнего источника. Если Android считает, что это не правильно, вы не получите onCallStateChanged
называется зефир. Просто используйте поддельный номер 1234567890,,2#
("неверно") против 1234567890
("Действительный"), чтобы подтвердить это. Я пока не знаю, как "исправить" номер, так как часть чисел с расширениями работает.
Редактировать: отчет об ошибке я открыл в 16 декабря 15
Пожалуйста, опубликуйте свой AndroidManifest, а также проверьте следующую документацию:
Обратите внимание, что доступ к некоторой информации о телефонии защищен разрешениями. Ваше приложение не будет получать обновления для защищенной информации, если оно не имеет соответствующих разрешений, объявленных в файле манифеста. Там, где применяются разрешения, они отмечены в соответствующих флагах LISTEN_.
(Источник:) номер телефона входящего вызова. Если приложение не имеет разрешения READ_PHONE_STATE, пустая строка будет передана в качестве аргумента.