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;
}