2011-03-30 14 views
8

¿Hay alguna manera de escuchar las llamadas entrantes extendiendo BroadcastReceiver para escuchar la transmisión del sistema operativo, sin utilizar PhoneStateIntentReceiver o PhoneStateListener? También dígame qué acción y permisos se manifestarán.Escucha las llamadas entrantes a través de BroadcastReceiver, sin PhoneStateIntentReceiver o PhoneStateListener

He tratado con la siguiente manera pero no funciona para llamadas entrantes, pero que trabaja para

El único archivo .java uno de aplicación es el siguiente (la aplicación sólo un archivo de salida un archivo .java y 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");   
    } 
} 

manifiesta

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

Respuesta

8

La acción que ha definido en su manifiesto es incorrecta. este es un Intento de Acción que se puede usar para responder una llamada y no monitorear las llamadas entrantes.

Puede usar dos receptores de difusión que escuchen los intentos de emisión ACTION_PHONE_STATE_CHANGED y NEW_OUTGOING_CALL.

El ACTION_PHONE_STATE_CHANGED se recibirá cuando haya una nueva llamada entrante, una llamada respondida o un hangup (consulte la documentación de los EXTRA recibidos con este Intent).

NEW_OUTGOING_CALL se recibirá cuando se realice una nueva llamada saliente en su dispositivo.

En cuanto a permisos, creo que lo tienes sobre la derecha en su manifiesto (Asumo el permiso RECORD_AUDIO se utiliza para otra cosa en su aplicación)

0

Aquí está mi demo de prueba de unidad androide. 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 se olvide de agregar permisos

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