我注意到在TelephonyManager类中有CALL_STATE_IDLE、CALL_STATE_OFFHOOK和CALL_STATE_RINGING。它们似乎用于来电。
实际上,我想要做的是在呼出电话、接听电话或超时时得到通知。该如何实现?
我注意到在TelephonyManager类中有CALL_STATE_IDLE、CALL_STATE_OFFHOOK和CALL_STATE_RINGING。它们似乎用于来电。
实际上,我想要做的是在呼出电话、接听电话或超时时得到通知。该如何实现?
我不知道你是否能检测定时呼叫,但区分呼叫开始的时间是可能的。
你可以像这样做,在CALL_STATE_IDLE状态下:
Uri allCalls = Uri.parse("content://call_log/calls");
String lastMinute = String.valueOf(new Date().getTime() - DAY_IN_MILISECONDS);
//before the call started
Cursor c = app.getContentResolver().query(allCalls, null, Calls.DATE + " > "
+ lastMinute, null, Calls.DATE + " desc");
c.moveToFirst();
if (c.getCount() > 0) {
int duration = Integer.parseInt(c.getString(c.getColumnIndex(Calls.DURATION)));
}
如果通话持续时间>0,则表示通话已接听。
显然,还有其他标志可以用来确定CALL_STATE_IDLE在通话结束后被调用。
希望这能帮助你,并使你在尝试做某事时走上正确的道路。
需要做的最少是:
public class CallCounter extends PhoneStateListener {
public void onCallStateChanged(int state, String incomingNumber) {
switch(state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.d("Tony","Outgoing Call finished");
// Call Finished -> stop counter and store it.
callStop=new Date().getTime();
context.stopService(new Intent(context,ListenerContainer.class));
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d("Tony","Outgoing Call Starting");
// Call Started -> start counter.
// This is not precise, because it starts when calling,
// we can correct it later reading from call log
callStart=new Date().getTime();
break;
}
}
public class ListenerContainer extends Service {
public class LocalBinder extends Binder {
ListenerContainer getService() {
return ListenerContainer.this;
}
}
@Override
public void onStart(Intent intent, int startId) {
TelephonyManager tManager =(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
CallCounter callCounter=new CallCounter(this);
tManager.listen(callCounter,PhoneStateListener.LISTEN_CALL_STATE);
Log.d("Tony","Call COUNTER Registered");
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
// This is the object that receives interactions from clients. See
// RemoteService for a more complete example.
private final IBinder mBinder = new LocalBinder();
}
public class myReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
context.startService(new Intent(context,ListenerContainer.class));
}
}
}