¿Cómo accedo al registro de llamadas para Android?

Me gustaría recibir el registro de llamadas. Por ejemplo, la cantidad de llamadas realizadas por el usuario, el número de minutos llamados, etc.

¿Cómo logro esto en Android?

Esto es para acceder al historial de llamadas telefónicas:

A partir de Jellybean (4.1) necesita el siguiente permiso:

Código:

  Uri allCalls = Uri.parse("content://call_log/calls"); Cursor c = managedQuery(allCalls, null, null, null, null); String num= c.getString(c.getColumnIndex(CallLog.Calls.NUMBER));// for number String name= c.getString(c.getColumnIndex(CallLog.Calls.CACHED_NAME));// for name String duration = c.getString(c.getColumnIndex(CallLog.Calls.DURATION));// for duration int type = Integer.parseInt(c.getString(c.getColumnIndex(CallLog.Calls.TYPE)));// for call type, Incoming or out going. 

Este es el método utilizado para obtener el registro de llamadas. Simplemente ponga este método en su clase y obtenga la Lista del Registro de llamadas.

Mira esto

 private String getCallDetails() { StringBuffer sb = new StringBuffer(); Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null, null, null, null); int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE); int date = managedCursor.getColumnIndex(CallLog.Calls.DATE); int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION); sb.append("Call Details :"); while (managedCursor.moveToNext()) { String phNumber = managedCursor.getString(number); String callType = managedCursor.getString(type); String callDate = managedCursor.getString(date); Date callDayTime = new Date(Long.valueOf(callDate)); String callDuration = managedCursor.getString(duration); String dir = null; int dircode = Integer.parseInt(callType); switch (dircode) { case CallLog.Calls.OUTGOING_TYPE: dir = "OUTGOING"; break; case CallLog.Calls.INCOMING_TYPE: dir = "INCOMING"; break; case CallLog.Calls.MISSED_TYPE: dir = "MISSED"; break; } sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration); sb.append("\n----------------------------------"); } managedCursor.close(); return sb.toString(); } 

el resultado se ve

enter image description here

usa este método desde cualquier lugar con un contexto

 private static String getCallDetails(Context context) { StringBuffer stringBuffer = new StringBuffer(); Cursor cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.DATE + " DESC"); int number = cursor.getColumnIndex(CallLog.Calls.NUMBER); int type = cursor.getColumnIndex(CallLog.Calls.TYPE); int date = cursor.getColumnIndex(CallLog.Calls.DATE); int duration = cursor.getColumnIndex(CallLog.Calls.DURATION); while (cursor.moveToNext()) { String phNumber = cursor.getString(number); String callType = cursor.getString(type); String callDate = cursor.getString(date); Date callDayTime = new Date(Long.valueOf(callDate)); String callDuration = cursor.getString(duration); String dir = null; int dircode = Integer.parseInt(callType); switch (dircode) { case CallLog.Calls.OUTGOING_TYPE: dir = "OUTGOING"; break; case CallLog.Calls.INCOMING_TYPE: dir = "INCOMING"; break; case CallLog.Calls.MISSED_TYPE: dir = "MISSED"; break; } stringBuffer.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration); stringBuffer.append("\n----------------------------------"); } cursor.close(); return stringBuffer.toString(); } 

Esta publicación es un poco antigua, pero aquí hay otra solución fácil para obtener datos relacionados con el proveedor de contenido de registros de Call en Android:

Utilice esta lib: https://github.com/EverythingMe/easy-content-providers

Recibe todas las llamadas:

 CallsProvider callsProvider = new CallsProvider(context); List calls = callsProvider.getCalls().getList(); 

Cada llamada tiene todos los campos, para que pueda obtener la información que necesita:
callDate, duración, número, tipo (INCOMING, OUTGOING, MISSED), isRead, …

Funciona con List o Cursor y hay una aplicación de muestra para ver cómo se ve y funciona.

De hecho, hay un soporte para todos los proveedores de contenido de Android, como: Contactos, SMS, Calendario, … Documento completo con todas las opciones: https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers

Espero que también haya ayudado 🙂

en mi proyecto recibo un error en el dispositivo htc. Ahora este código es universal. Creo que esto es de ayuda para ti.

  public class CustomContentObserver extends ContentObserver { public CustomContentObserver(Handler handler) { super(handler); System.out.println("Content obser"); } public void onChange(boolean selfChange) { super.onChange(selfChange); String lastCallnumber; currentDate = sdfcur.format(calender.getTime()); System.out.println("Content obser onChange()"); Log.d("PhoneService", "custom StringsContentObserver.onChange( " + selfChange + ")"); //if(!callFlag){ String[] projection = new String[]{CallLog.Calls.NUMBER, CallLog.Calls.TYPE, CallLog.Calls.DURATION, CallLog.Calls.CACHED_NAME, CallLog.Calls._ID}; Cursor c; c=mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, CallLog.Calls._ID + " DESC"); if(c.getCount()!=0){ c.moveToFirst(); lastCallnumber = c.getString(0); String type=c.getString(1); String duration=c.getString(2); String name=c.getString(3); String id=c.getString(4); System.out.println("CALLLLing:"+lastCallnumber+"Type:"+type); Database db=new Database(mContext); Cursor cur =db.getFirstRecord(lastCallnumber); final String endCall=lastCallnumber; //checking incoming/outgoing call if(type.equals("3")){ //missed call }else if(type.equals("1")){ //incoming call }else if(type.equals("2")){ //outgoing call } } c.close(); } } 

Para obtener el único historial de llamadas entrantes, el siguiente código te ayudará 🙂

 private void getCallDetailsAgil() { StringBuffer sb = new StringBuffer(); Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null, null, null, null); int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE); int date = managedCursor.getColumnIndex(CallLog.Calls.DATE); int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION); sb.append("Call Details :"); while (managedCursor.moveToNext()) { String phNumber = managedCursor.getString(number); String callType = managedCursor.getString(type); String callDate = managedCursor.getString(date); Date callDayTime = new Date(Long.valueOf(callDate)); String callDuration = managedCursor.getString(duration); String dir = null; int dircode = Integer.parseInt(callType); switch (dircode) { case CallLog.Calls.OUTGOING_TYPE: dir = "OUTGOING"; break; case CallLog.Calls.INCOMING_TYPE: dir = "INCOMING"; sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration); sb.append("\n----------------------------------"); miss_cal.setText(sb); break; case CallLog.Calls.MISSED_TYPE: dir = "MISSED"; break; } } managedCursor.close(); } 

Use el siguiente código:

 private void getCallDeatils() { StringBuffer stringBuffer = new StringBuffer(); Cursor managedCursor = getActivity().managedQuery(CallLog.Calls.CONTENT_URI, null, null, null, null); int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE); int date = managedCursor.getColumnIndex(CallLog.Calls.DATE); int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION); stringBuffer.append("Call Deatils"); while (managedCursor.moveToNext()) { String phNumber = managedCursor.getString(number); String callType = managedCursor.getString(type); String callDate = managedCursor.getString(date); Date callDayTime = new Date(Long.valueOf(callDate)); DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); String reportDate = df.format(callDayTime); String callDuration = managedCursor.getString(duration); String dir = null; int dircode = Integer.parseInt(callType); switch (dircode) { case CallLog.Calls.OUTGOING_TYPE: dir = "OUTGOING"; break; case CallLog.Calls.INCOMING_TYPE: dir = "INCOMING"; break; case CallLog.Calls.MISSED_TYPE: dir = "MISSED"; break; } stringBuffer.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " +callDate + " \nCall duration in sec :--- " + callDuration); stringBuffer.append("\n----------------------------------"); logs.add(new LogClass(phNumber,dir,reportDate,callDuration)); }