How to access the call log for Android?

I would like to receive a call log. For example, the number of calls made by the user, the number of minutes called, etc.

How do I achieve this in android?

+91
android
Jul 22 '11 at 7:01
source share
9 answers

This is for accessing phone call history:

As of Jellybean (4.1), you need the following permission:
<uses-permission android:name="android.permission.READ_CALL_LOG" />

The code:

  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. 
+67
Jul 22 2018-11-11T00:
source share

This is the method used to get the call log. Just put this method in your class and get a list of call logs.

check this

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

the output looks

enter image description here

+62
Dec 27 '12 at 7:00
source share

use this method everywhere with context

 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(); } 
+46
Jan 20 '14 at 15:02
source share

This post is a bit outdated, but here is another simple solution for getting data related to Call log content provider in Android:

Use this lib: https://github.com/EverythingMe/easy-content-providers

Receive all calls:

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

Each Call has all the fields, so you can get any necessary information:
callDate, duration, number, type (INPUT, OUTPUT, SKIP), isRead, ...

It works with List or Cursor , and there is an example application to see how it looks and works.

In fact, there is support for all Android content providers, such as: Contacts, SMS, Calendar, ... Full document with all options: https://github.com/EverythingMe/easy-content-providers/wiki/Android-providers

Hope this also helped :)

+16
Aug 21 '15 at 20:43
source share

in my project I get an int htc device.now error, this code is universal. I think this will help you.

  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(); } } 
+8
Dec 10
source share

To get only the history of incoming calls, the code below will help you :)

 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(); } 
+2
Dec 12 '16 at 8:03
source share

To get a history of incoming, outgoing and missed calls, I hope this code helps you :)

Name this code in your background thread.

  StringBuffer sb = new StringBuffer(); String[] projection = new String[] { CallLog.Calls.CACHED_NAME, CallLog.Calls.NUMBER, CallLog.Calls.TYPE, CallLog.Calls.DATE, CallLog.Calls.DURATION }; sb.append("Call Details :"); // String strOrder = android.provider.CallLog.Calls.DATE + " DESC"; Cursor managedCursor = getApplicationContext().getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, null); while (managedCursor.moveToNext()) { String name = managedCursor.getString(0); //name String number = managedCursor.getString(1); // number String type = managedCursor.getString(2); // type String date = managedCursor.getString(3); // time @SuppressLint("SimpleDateFormat") SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm"); String dateString = formatter.format(new Date(Long.parseLong(date))); String duration = managedCursor.getString(4); // duration String dir = null; int dircode = Integer.parseInt(type); 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 Name :-- "+name+" Number:--- " + number + " \nCall Type:--- " + dir + " \nCall Date:--- " + dateString + " \nCall duration in sec :--- " + duration); sb.append("\n----------------------------------"); 
+2
Feb 18 '19 at 13:10
source share

Use the code below:

 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)); } 
+1
Apr 30 '18 at 5:44
source share

If we use Kotlin, this is shorter. An example of a class that is responsible for providing call logs:

 import android.content.Context import android.database.Cursor import android.provider.CallLog.Calls.* class CallsLoader { fun getCallLogs(context: Context): List<List<String?>> { val c = context.applicationContext val projection = arrayOf(CACHED_NAME, NUMBER, TYPE, DATE, DURATION) val cursor = c.contentResolver.query( CONTENT_URI, projection, null, null, null, null ) return cursorToMatrix(cursor) } private fun cursorToMatrix(cursor: Cursor?): List<List<String?>> { val matrix = mutableListOf<List<String?>>() cursor?.use { while (it.moveToNext()) { val list = listOf( it.getStringFromColumn(CACHED_NAME), it.getStringFromColumn(NUMBER), it.getStringFromColumn(TYPE), it.getStringFromColumn(DATE), it.getStringFromColumn(DURATION) ) matrix.add(list.toList()) } } return matrix } private fun Cursor.getStringFromColumn(columnName: String) = getString(getColumnIndex(columnName)) } 

We can also convert the cursor to a map:

 fun getCallLogs(context: Context): Map<String, Array<String?>> { val c = context.applicationContext val projection = arrayOf(CACHED_NAME, NUMBER, TYPE, DATE, DURATION) val cursor = c.contentResolver.query( CONTENT_URI, projection, null, null, null, null ) return cursorToMap(cursor) } private fun cursorToMap(cursor: Cursor?): Map<String, Array<String?>> { val arraySize = cursor?.count ?: 0 val map = mapOf( CACHED_NAME to Array<String?>(arraySize) { "" }, NUMBER to Array<String?>(arraySize) { "" }, TYPE to Array<String?>(arraySize) { "" }, DATE to Array<String?>(arraySize) { "" }, DURATION to Array<String?>(arraySize) { "" } ) cursor?.use { for (i in 0 until arraySize) { it.moveToNext() map[CACHED_NAME]?.set(i, it.getStringFromColumn(CACHED_NAME)) map[NUMBER]?.set(i, it.getStringFromColumn(NUMBER)) map[TYPE]?.set(i, it.getStringFromColumn(TYPE)) map[DATE]?.set(i, it.getStringFromColumn(DATE)) map[DURATION]?.set(i, it.getStringFromColumn(DURATION)) } } return map } 
0
Jul 02 '19 at 8:09
source share



All Articles