Как определить номер исходящего звонка в Android Q - PullRequest
0 голосов
/ 05 июля 2019

Я не могу получить номер исходящего вызова в Android Q .

Я зарегистрировал получателя в манифесте с этим фильтром намерений android.intent.action.NEW_OUTGOING_CALL и в коде я обнаруживаю исходящий номер телефона, подобный этому

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL"))
        String nr = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
}

Но я никогда не смогу получить номер исходящего вызова в Android Q , есть ли обходной путь, чтобы получить этот номер по-другому, или Android Q совершенно невозможно определить номер исходящего вызова

Редактировать: работает с предыдущими версиями Android

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Вам необходимо добавить разрешение PROCESS_OUTGOING_CALLS

Создать OutboundCallReceiver

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;

public class OutgoingCallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

            TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
            if (tm.getCallState() == TelephonyManager.CALL_STATE_OFFHOOK) {

                String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

            }

    }

}

Добавить необходимые разрешения для чтения исходящего вызова в файле AndroidManifest

  <uses-permission android:name="android.permission.NEW_OUTGOING_CALL" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

Запрос разрешений во время выполнения

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.PROCESS_OUTGOING_CALLS, Manifest.permission.READ_PHONE_STATE},
                    1);
        }

Добавить OutgoingCallReceiver в файл AndroidManifest

  <receiver
        android:name=".application.services.OutgoingCallReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>

Этот код будет хорошо работать с вами, но , когда вам нужно загрузить свое приложение в Google play. Это нормально с разрешениями NEW_OUTGOING_CALL и READ_PHONE_STATE, но, вы получите уведомление о политике от playStore:

Манифест вашего приложения запрашивает группу разрешений Журнала вызовов (например, PROCESS_OUTGOING_CALLS) Он должен быть активно зарегистрирован в качестве обработчика телефона или помощника по умолчанию на устройстве.

в этом случае у вас есть 2 решения, только если вы хотите прочитать номер OutCommingCall:

Отправьте форму декларации в Google Форма декларации

Или создайте приложение для дозвона

Проверка Центр политик разработчика

0 голосов
/ 05 июля 2019

Из документации для android.intent.action.NEW_OUTGOING_CALL :

Эта константа устарела на уровне API 29. Приложения, которые перенаправляют исходящие вызовы должны использовать API CallRedirectionService. Приложения, которые Для проверки вызовов следует использовать API-интерфейс CallScreeningService.

https://developer.android.com/reference/android/content/Intent

Так что я бы сначала реализовал этот API и проверил, работает ли он должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...