Reputation: 121
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...
Help me in getting the issue solved.. Thanks in advance for spending your valuable time on my issue.
Here is my 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)
&& (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);
}
}
}
I also added the permissions in the manifest file like this..
<receiver android:name="IncomingCallReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" >
</action>
</intent-filter>
</receiver>
Upvotes: 3
Views: 5635
Reputation: 1
This code is working on Android 4 or 5 Android Sdk:- you Will get Subcrption id from this line :- whichSIM = intent.getExtras().getInt("subscription");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Bundle bundle = intent.getExtras();
if (bundle != null) {
Set<String> keys = bundle.keySet();
Iterator<String> it = keys.iterator();
while (it.hasNext()) {
String key = it.next();
Log.e("BUNDEL-VALUE","[" + key + "=" + bundle.get(key)+"]");
}
}
if (intent.getExtras().containsKey("subscription")) {
whichSIM = intent.getExtras().getInt("subscription");
HelperFunctions.theLogger("WhichSim", "before value: " + whichSIM);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = preferences.edit();
editor.putLong("ChooseSim", whichSIM);
editor.commit();
}
}
//Working code For 4.4 Phones KitKat
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
whichSIM = intent.getExtras().getInt("subscription");
if (whichSIM == 0) {
whichSIM = 1;
editor.putLong("ChooseSim", whichSIM);
editor.commit();
// Incoming call for SIM1
// Toast.makeText(context,"Getting Sim Id "+whichSIM,Toast.LENGTH_LONG).show();
} else if (whichSIM == 1) {
whichSIM = 2;
editor.putLong("ChooseSim", whichSIM);
editor.commit();
// Toast.makeText(context,"Getting Sim Id "+whichSIM,Toast.LENGTH_LONG).show();
}
}
Upvotes: 0
Reputation: 39
This will give your incoming number whatever it is dual sim or single:
Bundle bundle = intent.getExtras();
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if (state != null){
callFromSecondSimNo = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
}
Upvotes: 1
Reputation: 3004
It's showing the wrong duration, because the state will get changed to OFF_HOOk once the number has been dialled. But actually it shouldn't. It should change to OFF_HOOk once the user at the other side has accepted your call.
Unfortunately the device won't turn up the Ringing state for the outgoing call in android.! It directly switches to OFF_Hook!!
Upvotes: 0