Obtenga la última llamada en CallLOG usando un servicio
-
23-12-2019 - |
Pregunta
Estoy haciendo un programa para enviar el llamado a un servidor, creé un servicio que hace una encuesta del estado del teléfono con el siguiente método. Este método se llama OnCreate.
private void pollForCallStatus() {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.d("Poll", Integer.toString(telephonyManager.getCallState()));
switch (telephonyManager.getCallState()){
case TelephonyManager.CALL_STATE_RINGING:
Log.d("CallService", "ringing");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
callStart();
break;
case TelephonyManager.CALL_STATE_IDLE:
callEnd();
break;
}
}
}, 0, 1000);
}
El método CALLEND, verifique si la llamada ha comenzado, si es el caso, obtiene la duración de esta llamada de la llamada, utilizo CALLLOG porque no puedo determinar cuándo se inicia las llamadas salientes.
private void callEnd() {
if (isStart) {
Log.d("CallService", "callEnd");
Integer duration = getDuration();
Log.d("CallService", duration.toString());
Command sender = new SendCall(this.phoneNumber, duration);
isStart = false;
this.stopSelf();
}
}
Pegificé la Duración del método, la usé para obtener la duración de la llamada en CallLOG.
private Integer getDuration(){
Integer duration = 0;
callLogCursor.moveToFirst();
if ( phoneNumber.equalsIgnoreCase(callLogCursor.getString(callLogCursor.getColumnIndex(CallLog.Calls.NUMBER))) )
duration = callLogCursor.getInt(callLogCursor.getColumnIndex(CallLog.Calls.DURATION));
return duration;
}
Mi problema es que la Detección no me consiga la última duración de la llamada, a pesar de que recito la llamada anterior. Intenté esperar más tiempo, pero recibo el mismo resultado.
--- Editar ---
Cambié el código para usar CONTENTOBSERVER, pero tengo el mismo resultado. Creo que el observador en BroadcastReceiver
public class CallsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
ContentResolver cr = context.getContentResolver();
Cursor callLogCursor = cr.query(android.provider.CallLog.Calls.CONTENT_URI,
null,
null,
null,
android.provider.CallLog.Calls.DEFAULT_SORT_ORDER /*sort by*/);
Command sender = new SendCall(phoneNumber, callLogCursor);
context.getContentResolver().
registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI,
true, new CallObserver(context, sender));
}
}
Cuando CallLog Cambiar ejecuta la Duración del método, la nueva BETDURATION es
private Integer getDuration(){
Integer duration = 0;
callCursor.moveToFirst();
if ( phoneNumber.equalsIgnoreCase(callCursor.getString(callCursor.getColumnIndex(CallLog.Calls.NUMBER))) )
duration = callCursor.getInt(callCursor.getColumnIndex(CallLog.Calls.DURATION));
Log.d("SendCall.getDuration", duration.toString());
return duration;
}
Y la duración de la última llamada continúa incorrectamente, esta duración es para la llamada anterior. No sé que puedo hacerlo.
Solución
Agregar un ContentObServer en el registro de llamadas que le notificará cuando se cambie cualquier cosa en CallLOG I.E. Si se agrega una llamada nueva al registro de llamadas o eliminó el registro de llamadas
editar
Pruebe esto Obtenga un nuevo registro de llamadas después de que finalice los acabados. Me estoy obteniendo el resultado correcto con este código
Espere durante 3-4 segundos después de que finalice la llamada y luego
CursorLoader cursorLoader = new CursorLoader(mActivity,
CallLog.Calls.CONTENT_URI, null, null, null, null);
managedCursor = cursorLoader.loadInBackground();
int durationIndex = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
managedCursor.moveToFirst();
String duration =managedCursor.getString(duration)