Estado de llamada saliente, repito, LLAMADA SALIENTE

184 views
Skip to first unread message

Ing. Jesus Tejerina Rivera

unread,
Nov 21, 2015, 11:27:14 AM11/21/15
to desarrolladores-android
Buen dia a todos. Mi pregunta es "sencilla".

Cómo saber el estado de una llamada saliente, repito LLAMADA SALIENTE.

Hay muchos ejemplos de llamadas entrantes con broadcast receiver, pero necesito para LLAMADAS SALIENTES.

SABER EL ESTADO EN LLAMADA SALIENTE:
Cuando está timbrando,
Cuando contestan,
Cuando estan hablando,
Cuando cuelgan.

No necesito teoria, necesito un ejemplo práctico y funcional.

Mil Gracias.

Eduardo Martin Cabrera

unread,
Nov 23, 2015, 8:45:57 AM11/23/15
to desarrollad...@googlegroups.com
Hola buenos días Jesús, yo encuentro apropiado para eso usar 2 broadcast receiver's; uno para detectar el inicio de la llamada saliente, el otro para seguir el estado de la llamada, coordinándolo de alguna forma con el otro broadcast, porque no todo en este ultimo? porque este atiende a los estados de la llamada y no parece haber forma de saber el la dirección de la misma (E/S)

En cuanto a los estados de la llamada no hay mucho que elegir, normal o "colgado", sonando (localmente), y descolgado

>> Hay muchos ejemplos de llamadas entrantes con broadcast receiver, pero necesito para LLAMADAS SALIENTES.
.- Es verdad hay mucho mas sobre llamadas entrantes que salientes, si se trata del broadcast que usa PHONE_STATE en el intent filter, este sirve para ambos tipos de llamadas(E/S), lo malo que no hay forma de saber la direccion, o al menos yo desconozco, revisando el bundle del intent con debugging, tampoco no encontré nada

>> SABER EL ESTADO EN LLAMADA SALIENTE:
>> Cuando está timbrando,
.- No estoy seguro pero creo que EXTRA_STATE_RINGING, solo se obtiene cuando se recibe llamada, (habría que hacer pruebas para llamadas saliente pero creo que no se recibe nada en ese caso)

>> Cuando contestan,
EXTRA_STATE_OFFHOOK

>> Cuando estan hablando,
.- (???) hum, ya es mucho me parece!!! estas trabajando para el gran hermano? jajaja, pero creo que puede suplirse con lo anterior (cuando contestan); sino si es preciso saber cuando hay conversación, es decir voz, habría que agregar mas permisos (RECORD_AUDIO, con lo feo que eso suena para el usuario, que una app puede grabarle las conversaciones) tomar el audio, y medir la señal, y eso me parece que es bastante complicación.
>>Cuando cuelgan.
EXTRA_STATE_IDLE

de nuevo lo malo de esto es no tener una forma práctica de tener todo en mismo broadcast, a lo mejor la hay pero yo actualmente la desconozco, la idea que propongo es:
* Usar el Broadcast con intent filter NEW_OUTGOING_CALL y setear un flag (inventado por nos.) indicando que se inicio una llamada saliente, ya sea en db o en shared preferences, tal vez estaría bueno agregar un valor con el timestamp (unix time)
* Usar el Broadcast con intent filter PHONE_STATE
para rastrear el estado de la llamada, comprobando siempre nuestro flag de llamada saliente iniciada , si dicho flag esta activo entonces procesar el estado, ademas cuando se cuelgue es decir se pase al estado IDLE, hay que volver a poner dicho flag en 0, (off,  false, lo que sea), espero haberme explicado lo mejor posible, bueno aquí va un poco de código, ojalá que sirva:

permisos:

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


BroadcastReceiver para cuando se hace una llamada
(Outgoing.java) - requiere  PROCESS_OUTGOING_CALLS
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class Outgoing extends BroadcastReceiver {
public Outgoing() {
}

@Override
public void onReceive(Context context, Intent intent) {
String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);

Toast.makeText(context,
"Outgoing: " + number,
Toast.LENGTH_LONG).show();
}
}

Broadcast Recevier para los estados de la llamada
(PhoneState.java) - Requiere READ_PHONE_STATE
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

public class PhoneState extends BroadcastReceiver {

String TAG = "com.desarrolladoresandroid.estadollamadasaliente";

public PhoneState() {
}

@Override
public void onReceive(Context context, Intent intent) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

if(state.contains(TelephonyManager.EXTRA_STATE_IDLE)){
Log.d(TAG, "EXTRA_STATE_IDLE");
showToast("EXTRA_STATE_IDLE", context);
}else if(state.contains(TelephonyManager.EXTRA_STATE_RINGING)){
Log.d(TAG, "EXTRA_STATE_RINGING");
showToast("EXTRA_STATE_RINGING", context);

}else if(state.contains(TelephonyManager.EXTRA_STATE_OFFHOOK)){
Log.d(TAG, "EXTRA_STATE_OFFHOOK");
showToast("EXTRA_STATE_OFFHOOK", context);
}
}

private void showToast(String msg, Context ctx){
Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
}
} //


Declaración de los B. Receiver's en manifest (habrá que revisar los atributos enabled y exported que figuran así por defecto, dado que estoy copiando código de ejemplo desde el ide)

<receiver
android:name=".PhoneState"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="999" >
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<receiver
android:name=".Outgoing"
android:enabled="true"
android:exported="true" >
<intent-filter android:priority="999">
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
Reply all
Reply to author
Forward
0 new messages