在OnReceive
方法我有这样的事情:
Bundle bundle=intent.getExtras();
String phonenumber=intent.getStrngExtra(Intent.EXTRA_PHONE_NUMBER);
如何再检查一下,如果拨号呼叫仍然还是客户端挂了电话? 如何检查是否呼叫被应答?
我需要打印一个toat当客户挂了电话或当被叫客户端应答呼叫。
在OnReceive
方法我有这样的事情:
Bundle bundle=intent.getExtras();
String phonenumber=intent.getStrngExtra(Intent.EXTRA_PHONE_NUMBER);
如何再检查一下,如果拨号呼叫仍然还是客户端挂了电话? 如何检查是否呼叫被应答?
我需要打印一个toat当客户挂了电话或当被叫客户端应答呼叫。
您可以使用下面的代码来处理呼叫状态:::
private Runnable callMonitor = new Runnable() {
public void run() {
try {
EndCallListener callListener = new EndCallListener();
TelephonyManager mTM = (TelephonyManager)m_activity.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(callListener, PhoneStateListener.LISTEN_CALL_STATE);
} catch(Exception e) {
Log.e("callMonitor", "Exception: "+e.toString());
}
}
};
private class EndCallListener extends PhoneStateListener {
private boolean active = false;
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if(TelephonyManager.CALL_STATE_RINGING == state) {
Log.i("EndCallListener", "RINGING, number: " + incomingNumber);
}
if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
//wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call.
active = true;
Log.i("EndCallListener", "OFFHOOK");
}
if(TelephonyManager.CALL_STATE_IDLE == state) {
//when this state occurs, and your flag is set, restart your app
Log.i("EndCallListener", "IDLE");
if (active) {
active = false;
// stop listening
TelephonyManager mTM = (TelephonyManager)m_activity.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(this, PhoneStateListener.LISTEN_NONE);
// restart the inbox activity
// Intent intent = new Intent(m_activity, MDInboxActivity.class);
// m_activity.startActivity(intent);
}
}
}
}
您将需要采取行动注册的广播接收器android.intent.action.PHONE_STATE
如果手机状态没有变为空闲一旦摘机 ,这意味着呼叫仍在继续。
呼叫被应答 ,则在读取手机状态广播接收器的状态变为摘机 。 把举杯为需要在这些国家。
public class CallDurationReceiver extends BroadcastReceiver {
static boolean flag =false;
static long start_time,end_time;
@Override
public void onReceive(Context arg0, Intent intent) {
String action = intent.getAction();
if(action.equalsIgnoreCase("android.intent.action.PHONE_STATE")){
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_RINGING)) {
//tOAST FOR INCOMING CALL, NOT YET PICKED UP
}
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_IDLE)) {
end_time=System.currentTimeMillis();
//Total time talked =
long total_time = end_time-start_time;
//Store total_time somewhere or pass it to an Activity using intent
} if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
TelephonyManager.EXTRA_STATE_OFFHOOK)) {
start_time=System.currentTimeMillis();
}
}
}
注册您的接收器在你这样的清单文件:
<receiver android:name=".CallDurationReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
}
另外补充的使用权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
以及所有我找到了一个解决方案,我成功地实施it.Its不可能当被叫方接受的呼出,以获取准确的时间。
在另一端拿起电话之前已经通过2个阶段已经过去了即on_State_idle
和on_state_offhook
。 On_state_ringing
不工作的呼出。
让我们假设一个电话响起40秒(这个我不知道),如果连续在对方的人没有接电话。
开始的起步阶段沿着计时器on_State_idle
和on_state_offhook
。
如果计时器跨上述40秒是指在另一方面接我电话的人两种情况。
如果on_State_idle->on_state_offhook->on_State_idle
40秒内工作意味着另一方面没有接我的电话。
如果第二种情况是真实的,取从呼叫记录中的呼叫通话时长。
Totaltimer运行时间 - 时间在通话记录让你呼出的采摘的确切时间!