2010-05-20 9 views

risposta

1

Da quello che ho capito, è possibile rilevare che una chiamata in uscita è stata avviata perché lo stato del telefono passa da inattivo a off-gancio. Tuttavia, da lì, conoscendo lo stato di quella chiamata, ovvero sapendo se la chiamata che stai chiamando sta suonando, essere trasferita alla casella vocale, effettivamente rilevata o appena scaduta sembra essere qualcosa che non possiamo rilevare.

Ora non sono sicuro se è appena rilevabile nell'SDK, ma è comunicato sulla rete e probabilmente rilevabile dal ricevitore radio stesso o se tale informazione è semplicemente non trasmessa.

1

Il minimo che si deve fare è:

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

come funziona il codice ....? –

+0

Questo non funzionerà mai. CALL_STATE_OFFHOOK viene chiamato immediatamente quando il telefono compone un numero in uscita. – AndroidDev

1

Non so se è possibile rilevare una chiamata a tempo, ma distinguere quando la chiamata ha iniziato è possibile.

Puoi farlo in questo modo, nel 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))); 
} 

se la durata è> 0 allora allora chiamata è stata risposta.

Ovviamente ci sono altri flag che è necessario utilizzare per determinare che CALL_STATE_IDLE viene chiamato dopo che è stata effettuata una chiamata.

Spero che ti aiuti e ti metta nel modo corretto per ciò che stai cercando di fare.

+0

Non perdere tempo con questa soluzione. La durata non sarà mai zero. Comprenderà il tempo di attesa fino a quando la persona non solleverà il telefono. Il modo più semplice per verificare è semplicemente comporre un numero, non farlo scattare e lasciare semplicemente il timeout del telefono o riagganciare. Noterai che la durata nel registro delle chiamate non sarà zero. – AndroidDev

+1

@AndroidDev Bene, immagino che ciò dipenda dal modello del telefono, perché ho provato in alcuni telefoni e una chiamata senza risposta ha dato un registro di durata 0s. – htafoya

Problemi correlati