Android не определяет правильное действие намерения

Я пишу приложение для Android (kotlin), которое регистрирует входящие и исходящие звонки (информация о номере телефона и дате). Пока что по входящим звонкам могу узнать номер телефона, а по исходящим не получил.

Я просмотрел руководства, и все они предлагают проверить действие намерения, а затем получить номер, по которому я пытаюсь позвонить.

в файле манифеста я добавил разрешения и получателя

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<receiver android:name=".PhoneStateReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
</receiver>

в PhoneStateReceiver я пытаюсь получить номера телефонов

 class PhoneStateReceiver : BroadcastReceiver() {

    private val TAG = "PhoneStateReceiver"

    private var lastState = TelephonyManager.CALL_STATE_IDLE

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

    private fun checkCall(intent: Intent?) {
        val state = intent?.getStringExtra(TelephonyManager.EXTRA_STATE)

        if (intent?.action.equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
            var number = intent?.getStringExtra(Intent.EXTRA_PHONE_NUMBER)
            Log.d(TAG, "Outgoing number : $number")
        }else {
            if (lastState == TelephonyManager.CALL_STATE_IDLE) {
                if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                    val number = intent?.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)
                    Log.d(TAG, "Incoming number : $number")
                }
            }
        }
        Log.d(TAG, state)
        lastState = intState(state)
    }

а в MainActivity я прошу только разрешения:

class MainActivity : AppCompatActivity() {

    private var PERMISSION_ALL = 1
    private var PERMISSIONS = arrayOf(
        Manifest.permission.READ_PHONE_STATE,
        Manifest.permission.PROCESS_OUTGOING_CALLS
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        if(!hasPermissions(this, Manifest.permission.READ_PHONE_STATE, Manifest.permission.PROCESS_OUTGOING_CALLS)){
            ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
        }
    }

    private fun hasPermissions(context: Context, vararg permissions: String): Boolean = permissions.all {
        ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
    }


}

Действие при исходящем вызове должно быть Intent.ACTION_NEW_OUTGOING_CALL Однако, когда я делаю исходящий вызов, это действие выглядит как Intent.PHONE_STATE

Почему это так и как это исправить?

1 ответ

Добавьте оба действия в одно intent-filter

<receiver android:name=".PhoneStateReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
</receiver>
Другие вопросы по тегам