Я пытаюсь сделать приложение типа, когда на телефон поступает звонок, я хочу определить номер. Ниже то, что я пробовал, но он не обнаруживает входящие звонки.
Я хочу работать MainActivity
в фоновом режиме, как я могу это сделать?
Я дал разрешение в manifest
файле.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Что еще мне следует указать в манифесте?
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_layout);
}
public class myPhoneStateChangeListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
if (state == TelephonyManager.CALL_STATE_RINGING) {
String phoneNumber = incomingNumber;
}
}
}
}
Ответы:
Вот что я для этого использую:
Manifest:
Моя база многоразового детектора вызовов
Затем, чтобы использовать его, просто создайте из него класс и реализуйте несколько простых функций, в зависимости от того, какие типы вызовов вам нужны:
Кроме того, вы можете увидеть мою рецензию о том, почему код такой, как в моем блоге . Ссылка на Gist: https://gist.github.com/ftvs/e61ccb039f511eb288ee
РЕДАКТИРОВАТЬ: обновлен до более простого кода, поскольку я переработал класс для собственного использования
источник
lastState
не следует инициализироватьCALL_STATE_IDLE
. Мне не хватает нескольких вызовов, когда мое приложение убивают, пока текущее состояниеRINGING
. Потому что, когда онIDLE
снова становится по окончании вызова, статическая переменная повторно инициализируется,CALL_STATE_IDLE
и она ничего не делает. Так что теряем ссылку наlastState
.зарегистрироваться
и отменить регистрацию
источник
С Android P - уровень Api 28: вам необходимо получить разрешение READ_CALL_LOG
Ограниченный доступ к журналам вызовов
Android P передвигает
CALL_LOG
,READ_CALL_LOG
,WRITE_CALL_LOG
иPROCESS_OUTGOING_CALLS
разрешение отPHONE
группы разрешений на новоеCALL_LOG
разрешении группы. Эта группа дает пользователям лучший контроль и видимость приложений, которым требуется доступ к конфиденциальной информации о телефонных звонках, такой как чтение записей телефонных звонков и идентификация телефонных номеров.Чтобы читать числа из действия намерения PHONE_STATE, вам нужны как
READ_CALL_LOG
разрешение, так иREAD_PHONE_STATE
разрешение .onCallStateChanged()
Теперь для чтения чисел вам нужноREAD_CALL_LOG
только разрешение. Вам больше не нужноREAD_PHONE_STATE
разрешение.источник
READ_CALL_LOG
вAndroidManifest.xml
центре внимания на добавление запрос на разрешение вMainActivity
.ОБНОВЛЕНИЕ: действительно потрясающий код, опубликованный Гейбом Сечаном, больше не работает, если вы явно не попросите пользователя предоставить необходимые разрешения. Вот код, который вы можете разместить в своей основной деятельности, чтобы запросить эти разрешения:
ТАКЖЕ: как кто-то упомянул в комментарии под сообщением Гейба , вам нужно добавить небольшой фрагмент кода
android:enabled="true
в приемник, чтобы обнаруживать входящие вызовы, когда приложение в настоящее время не работает на переднем плане:источник
это может помочь вам, а также добавить требование разрешения
источник
Просто чтобы обновить ответ Гейба Сечана. Если ваш манифест запрашивает разрешения для READ_CALL_LOG и READ_PHONE_STATE, onReceive будет вызван TWICE . В одном из них есть EXTRA_INCOMING_NUMBER, а в другом - нет. Вы должны проверить, у кого это есть, и это может происходить в любом порядке.
https://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED
источник
Вот простой метод, позволяющий избежать использования
PhonestateListener
и других осложнений.Итак, мы получаем 3 события от Android, например
RINGING
,OFFHOOK
иIDLE
. И для того , чтобы получить все возможные состояния вызова, мы должны определить наши собственные состояния нравитсяRINGING
,OFFHOOK
,IDLE
,FIRST_CALL_RINGING
,SECOND_CALL_RINGING
. Он может обрабатывать любые состояния в телефонном звонке.Пожалуйста, думайте, что мы получаем события от Android, и мы определим наши состояния при вызове. Смотрите код.
источник
@Gabe Sechan, спасибо за ваш код. Он отлично работает, за исключением
onOutgoingCallEnded()
. Это никогда не выполняется. Тестируемые телефоны - Samsung S5 и Trendy. Думаю, есть 2 ошибки.1: пара скобок отсутствует.
2:
lastState
не обновляется,state
если он находится в конце функции. Его следует заменить в первой строке этой функции наДополнительно я добавил
lastState
иsavedNumber
в общие предпочтения, как вы предложили.Просто протестировал его с указанными выше изменениями. Ошибка исправлена, по крайней мере, на моих телефонах.
источник
Пожалуйста, используйте приведенный ниже код. Это поможет вам получить входящий номер с другими деталями звонка.
activity_main.xml
MainActivity.java
и в вашем манифесте запрос на следующие разрешения:
источник
Вам нужен BroadcastReceiver для
ACTION_PHONE_STATE_CHANGED
этого, который будет вызывать ваш полученный каждый раз, когда состояние телефона изменяется с ожидания, звонка, снятия трубки, поэтому по предыдущему значению и новому значению вы можете определить, является ли это входящим / исходящим вызовом.Требуемое разрешение:
Но если вы также хотите получать EXTRA_INCOMING_NUMBER в этой трансляции, вам понадобится другое разрешение: "android.permission.READ_CALL_LOG"
И код примерно такой:
а в классе приемника мы можем получить текущее состояние, прочитав намерение следующим образом:
Результатом массовки может быть:
Для трансляции PHONE_STATE нам не нужно использовать разрешение PROCESS_OUTGOING_CALLS или устаревшее действие NEW_OUTGOING_CALL.
источник