0

Ich möchte die Gesprächsdauer aufzeichnen, aber was immer ich implementiert habe, gibt die Dauer an, ab der ich auf den Anrufknopf klicke. Ich brauche die Anrufdauer, wenn die angerufene Person den Anruf annimmt.Wie bekomme ich die Anrufdauer, wenn der Anruf beantwortet wird?

Hier ist mein Rundfunkempfänger.

public class CallDurationReceiver extends BroadcastReceiver { 

private static int lastState = TelephonyManager.CALL_STATE_IDLE; 
private static long callStartTime; 
private static long callEndTime; 
private static boolean isIncoming; 
private static String savedNumber; 


@Override 
public void onReceive(Context context, Intent intent) { 
    //Log.w("intent " , intent.getAction().toString()); 

    if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) { 
     savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER"); 

    } else { 
     String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE); 
     String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
     int state = 0; 
     if (stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)) { 
      state = TelephonyManager.CALL_STATE_IDLE; 
     } else if (stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { 
      state = TelephonyManager.CALL_STATE_OFFHOOK; 
     } else if (stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
      state = TelephonyManager.CALL_STATE_RINGING; 
     } 

     onCallStateChanged(context, state, number); 
    } 
} 


public void onCallStateChanged(Context context, int state, String number) { 
    if (lastState == state) { 
     //No change, debounce extras 
     return; 
    } 
    switch (state) { 
     case TelephonyManager.CALL_STATE_RINGING: 
      isIncoming = true; 
      callStartTime = new Date().getTime(); 

      savedNumber = number; 

      Toast.makeText(context, "Incoming Call Ringing", Toast.LENGTH_SHORT).show(); 
      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
      //Transition of ringing->offhook are pickups of incoming calls. Nothing done on them 
      if (lastState != TelephonyManager.CALL_STATE_RINGING) { 
       isIncoming = false; 
       callStartTime = new Date().getTime(); 
       Toast.makeText(context, "Outgoing Call Started", Toast.LENGTH_SHORT).show(); 
      } 

      break; 
     case TelephonyManager.CALL_STATE_IDLE: 
      //Went to idle- this is the end of a call. What type depends on previous state(s) 
      if (lastState == TelephonyManager.CALL_STATE_RINGING) { 
       //Ring but no pickup- a miss 
       // Toast.makeText(context, "Ringing but no pickup" + savedNumber + " Call time " + callStartTime + " Date " + new Date(), Toast.LENGTH_SHORT).show(); 
      } else if (isIncoming) { 

       // Toast.makeText(context, "Incoming " + savedNumber + " Call time " + callStartTime, Toast.LENGTH_SHORT).show(); 
      } else { 
       callEndTime = new Date().getTime(); 
       long diff = callEndTime - callStartTime; 
       long minutes = (diff/1000)/60; 
       long seconds = (diff/1000) % 60; 
       Toast.makeText(context, savedNumber + " Call time " + minutes + " and " + seconds, Toast.LENGTH_SHORT).show(); 

      } 

      break; 
    } 
    lastState = state; 
} 

Antwort

0

Statt broadcastreceiver der Verwendung, PhoneStateListener Verwendung auf unter Siehe: Privat final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {

@Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     if (DBG) Log.d(LOG_TAG, "PhoneStateListener.onCallStateChanged: state=" + state); 

...... }

Staat wird sein:

/** Device call state: No activity. */ 
    public static final int CALL_STATE_IDLE = 0; 
    /** Device call state: Ringing. A new call arrived and is 
    * ringing or waiting. In the latter case, another call is 
    * already active. */ 
    public static final int CALL_STATE_RINGING = 1; 
    /** Device call state: Off-hook. At least one call exists 
     * that is dialing, active, or on hold, and no calls are ringing 
     * or waiting. */ 
    public static final int CALL_STATE_OFFHOOK = 2; 
     } 
    } 
}; 

registrieren Sie diesen Hörer wie folgt:

TelephonyManager tm = 
      (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); 
    tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); 
Verwandte Themen