Escuche las llamadas entrantes a través de BroadcastReceiver, sin fonestateIntentreceiver o fonestatelistener

StackOverflow https://stackoverflow.com/questions/5486793

  •  14-11-2019
  •  | 
  •  

Pregunta

Hay alguna forma de escuchar las llamadas entrantes al extender la transmisión de transmisión para escuchar la transmisión del sistema operativo, sin usar PhoneStateIntentRecreiver o fonestatelistener. Además, por favor, dígame qué será la acción y los permisos en manifiesto.

He intentado con la siguiente manera, pero no está funcionando para llamadas entrantes, pero trabajando para salientes

El único archivo de aplicación .java es la siguiente (la aplicación solo un archivo .java y un archivo manifiesto)

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");          
    }
}

manifiesto

<?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>

¿Fue útil?

Solución

La acción que ha definido en su manifiesto es incorrecto.Esta es una intención de acción que se puede usar para responder una llamada y no monitorear las llamadas entrantes.

Puede usar dos receptores de transmisión que escuchen action_phone_state_changed y new_outgoy_call Intents de transmisión.

Se recibirá la Action_Phone_State_Changed cuando haya una nueva llamada entrante, llame a la llamada o ha resuelto (consulte la documentación de los extras recibidos con esta intención).

Se recibirá el nuevo_uting_call cuando haya una nueva llamada saliente colocada en su dispositivo.

En cuanto a los permisos, creo que lo conseguí en su manifiesto (asumo que el permiso de Record_Audio se usa para otra cosa en su aplicación)

Otros consejos

Aquí está mi demostración para la prueba de unidad de Android.Puedes consultarlo.

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();
    }
}

No olvides agregar permisos

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top