我长期以来一直面临这个问题,无法解决以下问题。 我正在使用广播接收器来检测来电和去电详情。 现在调用持续时间的问题。对于来电,它显示正确的持续时间,但对于拨出电话,它显示错误的持续时间......
帮助我解决问题。提前感谢您将宝贵的时间花在我的问题上。
这是我的代码..
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);
}
}
}
我还在清单文件中添加了这样的权限..
<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>
答案 0 :(得分:1)
无论是双人卡还是单人卡,这都会为您提供来电号码:
Bundle bundle = intent.getExtras();
String state = bundle.getString(TelephonyManager.EXTRA_STATE);
if (state != null){
callFromSecondSimNo = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
}
答案 1 :(得分:0)
显示错误的持续时间,因为拨打号码后状态将变为OFF_HOOk。但实际上它不应该。一旦另一方的用户接听了您的电话,它就会变为OFF_HOOk。
不幸的是,设备不会为Android中的拨出呼叫启用振铃状态。它直接切换到OFF_Hook !!
答案 2 :(得分:0)
此代码可在Android 4或5 Android Sdk上使用:- 您将从以下行中获得订阅ID:-whichSIM = intent.getExtras()。getInt(“ subscription”);
如果(Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP){ 捆绑包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();
}
}