title: Detecting incoming and outgoing calls in android using broadcastReceiver
body: <p>I have been facing the problem from long time and not able to clear the following issue..
  I am using a broadcast receiver for detecting the incoming and outgoing calls details.
  Now the problem with duration of the call. For incoming call it is showing correct duration but for outgoing call it shows wrong duration...</p>
  
  <p>Help me in getting the issue solved.. Thanks in advance for spending your valuable time on my issue.</p>
  
  <p>Here is my code..</p>
  
  <pre><code>public class IncomingCallReceiver extends BroadcastReceiver {
  // db instance variables
  DBAdapter dba;
  
  // instance variables of sharedpreferences
  SharedPreferences mSharedPrefernce;
  Editor e;
  
  // String variables for number,date,time,calltype
  String number, date, time, calltype;
  long startTime, endTime;
  
  @Override
  public void onReceive(Context context, Intent intent) {
      Log.v("info", "calls info....");
  
      // initialising the sharedpreferences
      mSharedPrefernce = context.getSharedPreferences("MyPref", 0);
      e = mSharedPrefernce.edit();
  
      // Creating object for the DBAdapter
      dba = new DBAdapter(context);
      Bundle bundle = intent.getExtras();
  
      // Log.v("info", bundle.toString());
      if (bundle == null)
          return;
  
      // initialising the variables
      number = null;
      startTime = 0;
      endTime = 0;
  
      // getting incoming call details
      String state = bundle.getString(TelephonyManager.EXTRA_STATE);
      if ((state != null)
              &amp;&amp; (state
                      .equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING))) {
  
          Log.v("info", "Phone Ringing..");
  
          number = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
          Log.v("info", "Incomng Number: " + number);
  
          calltype = "Incoming";
  
          Time today = new Time(Time.getCurrentTimezone());
          today.setToNow();
  
          date = today.monthDay + "-" + (today.month + 1) + "-" + today.year;
          time = today.format("%k:%M:%S");
  
          // putting the values into the SharedPreferences
          e.putString("number", number);
          e.putString("Type", calltype);
          e.putString("date", date);
          e.putString("time", time);
          e.commit();
  
          Toast.makeText(
                  context,
                  "Detect Calls sample application\nIncoming number: "
                          + number, Toast.LENGTH_SHORT).show();
  
      }
      // getting outgoing call details
      else if (state == null) {
          number = bundle.getString(Intent.EXTRA_PHONE_NUMBER);
          Log.v("info", "Outgoing Number: " + number);
  
          calltype = "Outgoing";
  
          Time today = new Time(Time.getCurrentTimezone());
          today.setToNow();
  
          date = today.monthDay + "-" + (today.month + 1) + "-" + today.year;
          time = today.format("%k:%M:%S");
  
          // putting the values into the SharedPreferences
          e.putString("number", number);
          e.putString("Type", calltype);
          e.putString("date", date);
          e.putString("time", time);
          e.commit();
  
          Toast.makeText(
                  context,
                  "Detect Calls sample application\nOutgoing number: "
                          + number, Toast.LENGTH_SHORT).show();
  
      }
      // called when the call is answered
      else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
          Log.v("info", "Call Ansered..");
  
          startTime = System.currentTimeMillis();
          e.putLong("start", startTime);
          e.commit();
  
      } 
      // called when the call is ended
      else if (state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {
          Log.v("info", "Call Ended..");
  
          String phonenumber=null, type=null, date1=null, time1=null,  duration=null;
  
          // getting the values from the SharedPreferences
          phonenumber = mSharedPrefernce.getString("number", "");
          type = mSharedPrefernce.getString("Type", "");
          date1 = mSharedPrefernce.getString("date", "");
          time1 = mSharedPrefernce.getString("time", "");
          long start=0;
          start = mSharedPrefernce.getLong("start", 0);
          Log.v("info", "startTime=" + start);
  
          // clearing the SharedPreferences
          mSharedPrefernce.edit().clear();
  
          endTime = System.currentTimeMillis();
          Log.v("info", "endTime=" + endTime);
          long totalTime =0;
          totalTime = endTime - start;
  
          DateFormat df = new SimpleDateFormat("HH':'mm':'ss");
          df.setTimeZone(TimeZone.getTimeZone("GMT+0"));
  
          duration = df.format(new Date(totalTime));
  
          // inserting the call details into sqlite db
          dba.insertDetails(phonenumber, date1, time1, duration, type);
  
  
      }
  
  }
       }
  </code></pre>
  
  <p>I also added the permissions in the manifest file like this..</p>
  
  <pre><code>&lt;receiver android:name="IncomingCallReceiver" &gt;
          &lt;intent-filter&gt;
              &lt;action android:name="android.intent.action.PHONE_STATE" /&gt;
              &lt;action android:name="android.intent.action.NEW_OUTGOING_CALL" &gt;
              &lt;/action&gt;
          &lt;/intent-filter&gt;
      &lt;/receiver&gt;
  </code></pre>