Слушайте входящие звонки через BroadcastReceiver, без PhoneStateIntentReceiver или PhoneStateListener

Есть ли способ прослушивать входящие вызовы, расширив BroadcastReceiver для прослушивания трансляции ОС без использования PhoneStateIntentReceiver или PhoneStateListener. Также, пожалуйста, скажите мне, какие действия и разрешения будут в манифесте.

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

Единственный файл .java приложения выглядит следующим образом (только один файл .java и один файл манифеста).

package com.crsardar.media.audio;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class IncommingCallReceiverCRS extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("Chitta : ", "Its working");          
    }
}

манифест

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.crsardar.media.audio"
      android:versionCode="1"
      android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name">

    <receiver android:name="IncommingCallReceiverCRS" android:enabled="true"> 
        <intent-filter>
            <!--action android:name="android.intent.action.NEW_OUTGOING_CALL"/-->
            <action  android:name="android.intent.action.ANSWER" >
            <category  android:name="android.intent.category.DEFAULT" /> 
        </intent-filter>
    </receiver>

  </application>

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

person CR Sardar    schedule 30.03.2011    source источник
comment
Связано: stackoverflow.com/a/15564021/712526   -  person jpaugh    schedule 14.05.2019


Ответы (2)


Действие, которое вы определили в своем манифесте, неверно. это намерение действия, которое можно использовать для ответа на вызов, а не для отслеживания входящих вызовов.

Вы можете использовать два широковещательных приемника, которые прослушивают ACTION_PHONE_STATE_CHANGED и NEW_OUTGOING_CALL широковещательные намерения.

ACTION_PHONE_STATE_CHANGED будет получено при поступлении нового входящего звонка, ответе на звонок или завершении разговора (см. документацию по EXTRA, полученным с этим намерением).

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

Что касается разрешений, я думаю, вы правильно поняли это в своем манифесте (я предполагаю, что разрешение RECORD_AUDIO используется для чего-то еще в вашем приложении)

person Muzikant    schedule 20.05.2011

Вот моя демонстрация для модульного теста Android. Вы можете обратиться к нему.

public interface ICallVerify {
    void onOutgoing(Context context, Intent intent);
    void onCallStateChange(Context context, Intent intent);
}

protected void setUpCallVerify(final ICallVerify callVerify) {  //listen ingoing and outgoing
    final CountDownLatch latch = new CountDownLatch(1);
    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { //state change
                Log.i(TAG, "outgoing call...");
                callVerify.onOutgoing(context, intent);
            } else if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ // state changed
                String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
                if (state.equals("RINGING")) {
                    state += " number:" + intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                }
                Log.i(TAG, "call state changed.... " + state);
                callVerify.onCallStateChange(context, intent);
            }
        }
    };

    IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
    filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
    ContextUtils.getTargetContext().registerReceiver(receiver, filter);

    try {
        latch.await(5, TimeUnit.MINUTES);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Не забудьте добавить разрешения

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
person Victor Choy    schedule 03.03.2016