2010-05-20 15 views

Respuesta

1

Por lo que entiendo, puede detectar que se ha iniciado una llamada saliente porque el estado del teléfono cambia de inactivo a descolgado. Sin embargo, a partir de ahí, conocer el estado de esa llamada, es decir, saber si la llamada que está realizando sonará, se transferirá al correo de voz, en realidad se recogió o simplemente se agotó el tiempo parece ser algo que no podemos detectar.

Ahora no estoy seguro de si es simplemente indetectable en el SDK, pero se comunica a través de la red y posiblemente se puede detectar desde el propio receptor de radio, o si esa información simplemente no se está transmitiendo.

1

lo mínimo que se necesita hacer es:

public class CallCounter extends PhoneStateListener { 

    public void onCallStateChanged(int state, String incomingNumber) { 
     switch(state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
        Log.d("Tony","Outgoing Call finished"); 
        // Call Finished -> stop counter and store it. 
        callStop=new Date().getTime(); 
        context.stopService(new Intent(context,ListenerContainer.class)); 

       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
        Log.d("Tony","Outgoing Call Starting"); 
        // Call Started -> start counter. 
        // This is not precise, because it starts when calling, 
        // we can correct it later reading from call log 
        callStart=new Date().getTime(); 
       break; 
     } 
    } 


public class ListenerContainer extends Service { 
    public class LocalBinder extends Binder { 
     ListenerContainer getService() { 
      return ListenerContainer.this; 
     } 
    } 
    @Override 
    public void onStart(Intent intent, int startId) { 
     TelephonyManager tManager =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
     CallCounter callCounter=new CallCounter(this); 
     tManager.listen(callCounter,PhoneStateListener.LISTEN_CALL_STATE); 
     Log.d("Tony","Call COUNTER Registered"); 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 
    // This is the object that receives interactions from clients. See 
    // RemoteService for a more complete example. 
    private final IBinder mBinder = new LocalBinder(); 

} 

public class myReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 
      context.startService(new Intent(context,ListenerContainer.class)); 
     } 
     } 
} 
+0

cómo está funcionando el código ...? –

+0

Esto nunca funcionará. CALL_STATE_OFFHOOK se llama inmediatamente cuando el teléfono marca un número saliente. – AndroidDev

1

No sé si se puede detectar una llamada programada, pero las diferencias cuando se inició la llamada es posible.

Puede hacerlo de esta manera, en el CALL_STATE_IDLE:

Uri allCalls = Uri.parse("content://call_log/calls"); 
String lastMinute = String.valueOf(new Date().getTime() - DAY_IN_MILISECONDS); 
//before the call started 
Cursor c = app.getContentResolver().query(allCalls, null, Calls.DATE + " > " 
      + lastMinute, null, Calls.DATE + " desc"); 
c.moveToFirst(); 

if (c.getCount() > 0) { 
    int duration = Integer.parseInt(c.getString(c.getColumnIndex(Calls.DURATION))); 
} 

si la duración es> 0, entonces llamada fue respondida.

Obviamente, existen otros indicadores que debe utilizar para determinar que se llame a CALL_STATE_IDLE después de realizar una llamada.

Espero que te ayude y te ponga en la forma correcta de lo que estás tratando de hacer.

+0

No pierdas tu tiempo con esta solución. La duración nunca será cero. Incluirá el tiempo de espera hasta que la persona levante el teléfono. La forma más fácil de verificarlo es simplemente marcar un número, no deje que la persona lo recoja y luego deje que el teléfono agote el tiempo de espera o cuelgue. Notará que la duración en el registro de llamadas no será cero. – AndroidDev

+1

@AndroidDev Bueno, supongo que eso depende del modelo del teléfono, porque probé en algunos teléfonos y una llamada no respondida dio un registro de duración de 0s. – htafoya

Cuestiones relacionadas