Here I try to get the history of the last call log in my application after the call is completed with apk released ( Published in the play store as a public application ). Now I published my application as a personal application for one organization. I canโt get call log history in my personal application,
To get the call log log, I developed the following code:
public class CallLogListener extends BroadcastReceiver { private String tag = "CallLogListener"; History h; Call call; /** * This method is called when BroadcastReceiver receive some action from another app * * @param mContext Context which is received by BroadcastReceiver * @param i Intent which is received by BroadcastReceiver */ @Override public void onReceive(Context mContext, Intent i) { // TODO Auto-generated method stub try { h = new History(new Handler(), mContext, "0"); mContext.getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, h); Bundle bundle = i.getExtras(); if (bundle == null) return; SharedPreferences sp = mContext.getSharedPreferences(Constants.CallLogConstants.PREF_CALL_LOG, Activity.MODE_PRIVATE); savePrefBoolean(mContext, mContext.getString(R.string.IS_PHONE_CALL_STATE_BUSY), true); String s = bundle.getString(TelephonyManager.EXTRA_STATE); if (i.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { // call when call is in outgoing state Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); String number = i.getStringExtra(Intent.EXTRA_PHONE_NUMBER); sp.edit().putString(Constants.DatabaseConstants.EXTRA_NUMBER, number).commit(); sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, "OutGoing Call").commit(); sp.edit().putLong(Constants.DatabaseConstants.EXTRA_START_TIME, System.currentTimeMillis()).commit(); } else if (s.equals(TelephonyManager.EXTRA_STATE_RINGING)) { // call when call is in incoming ringing state String number = bundle.getString("incoming_number"); sp.edit().putString(Constants.DatabaseConstants.EXTRA_NUMBER, number).commit(); sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, s).commit(); } else if (s.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { // call when call is in offhook state sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, s).commit(); } else if (s.equals(TelephonyManager.EXTRA_STATE_IDLE)) { // call when call is in idle state savePrefBoolean(mContext, mContext.getString(R.string.IS_PHONE_CALL_STATE_BUSY), false); String state = sp.getString(Constants.DatabaseConstants.EXTRA_STATE, null); if (!state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); long temp = sp.getLong(Constants.DatabaseConstants.EXTRA_START_TIME, 0); String duration = String.valueOf((temp - System.currentTimeMillis()) / 1000); showLog(tag, "duration = " + duration, Constants.LogConstants.LOG_I, null); duration = StringUtils.trim(duration.replaceAll("\\D+", "")); sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, null).commit(); sp.edit().putLong(Constants.DatabaseConstants.EXTRA_START_TIME, 0).commit(); sp.edit().putString("call_duration", duration).commit(); h = new History(new Handler(), mContext, StringUtils.trim(duration.replaceAll("\\D+", ""))); mContext.getContentResolver().registerContentObserver(CallLog.Calls.CONTENT_URI, true, h); } sp.edit().putString(Constants.DatabaseConstants.EXTRA_STATE, s).commit(); } } catch (Exception e) { Crashlytics.logException(e); } } } public class History extends ContentObserver { private String tag; // Tag private Context mContext; private Cursor managedCursor; private boolean isCallEnd = false; private String TotalCallDuration; private CallInfo mCallInfo; /** * History is ContentObserver for call log * * @param handler activity handler * @param cc Context of an activity * @param duration total call duration ringing time and actual talk time. */ public History(Handler handler, Context cc, String duration) { // TODO Auto-generated constructor stub super(handler); tag = History.class.getSimpleName(); // Tag mContext = cc; this.TotalCallDuration = duration; } /** * This is Overrided method of ContentObserver * * @return boolean where true or false */ @Override public boolean deliverSelfNotifications() { return true; } /** * This is Overrided method of ContentObserver to check when call log is change * * @param selfChange to check if any thing change in call log */ @Override public void onChange(boolean selfChange) { // TODO Auto-generated method stub super.onChange(selfChange); try { SharedPreferences sp = mContext.getSharedPreferences(Constants.CallLogConstants.PREF_CALL_LOG, Activity.MODE_PRIVATE); String number = sp.getString(Constants.DatabaseConstants.EXTRA_NUMBER, null); String timeDuration = sp.getString("call_duration", "0"); if (number != null) { getCalldetailsNow(timeDuration); sp.edit().putString(Constants.DatabaseConstants.EXTRA_NUMBER, null).commit(); sp.edit().putString("call_duration", "0").commit(); } } catch (Exception e) { Crashlytics.logException(e); } } /** * Function to get call details using getContentResolver * and store call information in database * * @throws Exception this will throws exception and handles in root method */ private void getCalldetailsNow(String timeDuration) throws Exception { // TODO Auto-generated method stub if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat