Как определить номер входящего звонка и номер исходящего звонка, когда приложение убито ИЛИ не в фоновом режиме Android 8.0,9.0 - PullRequest
0 голосов
/ 03 августа 2020

Я работаю над приложением, и мое требование состоит в том, чтобы хранить все детали входящих и исходящих вызовов, такие как номер, продолжительность, время

Я использую для этого широковещательный приемник вместе с разрешениями времени выполнения READ_PHONE_STATE, READ_CALL_LOG

С текущим кодом приложение работает нормально, когда приложение находится на переднем плане, а также в фоновом режиме, НО, когда я убиваю приложение, оно не работает, оно не обнаруживает входящие / исходящие вызовы.

Ниже показано мой код файла манифеста

 <receiver
        android:name=".utils.CallReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter >
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />

            <category android:name="android.intent.category.HOME" />

            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

широковещательный приемник

 override fun onReceive(context: Context?, intent: Intent) {

    //We listen to two intents.  The new outgoing call only tells us of an outgoing call.  We use it to get the number.
    if (intent.action == "android.intent.action.NEW_OUTGOING_CALL") {
        savedNumber = intent.extras!!.getString("android.intent.extra.PHONE_NUMBER")
    } else {
        val stateStr =
            intent.extras!!.getString(TelephonyManager.EXTRA_STATE)
        val number =
            intent.extras!!.getString(TelephonyManager.EXTRA_INCOMING_NUMBER)
        var state = 0
        if (stateStr == TelephonyManager.EXTRA_STATE_IDLE) {
            state = TelephonyManager.CALL_STATE_IDLE
        } else if (stateStr == TelephonyManager.EXTRA_STATE_OFFHOOK) {
            state = TelephonyManager.CALL_STATE_OFFHOOK
        } else if (stateStr == TelephonyManager.EXTRA_STATE_RINGING) {
            state = TelephonyManager.CALL_STATE_RINGING
        }
        if (number != null && !number.isEmpty() && !number.equals("null")) {
            onCallStateChanged(context, state, number);
            Log.d("TEST :","NUMBER =>"+number);
            return;
        }


    }

Мне нужно решение, которое может обнаруживать входящий вызов, когда приложение убито, как истинное приложение вызывающего абонента, и хочу запустить приемник на Android 7,8,9 при звонке

1 Ответ

0 голосов
/ 11 августа 2020

когда приложение завершается с помощью «ПРИНУДИТЕЛЬНОГО ЗАКРЫТИЯ» пользователем, все широковещательные приемники приложения немедленно ставятся на паузу, и система не позволяет им принимать будущие широковещательные сообщения, пока пользователь вручную не откроет это приложение.

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

см. Здесь

У этого правила есть одно исключение - если приложение было настроено как приложение для телефона / SMS по умолчанию, оно все равно сможет просыпаться при получении звонка / SMS. Я предполагаю, что TrueCaller был установлен в качестве обработчика по умолчанию, чтобы можно было обойти это ограничение.

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