use*_*234 23 android telephony android-intent
当电话铃响时,我设法准备了一项活动.现在我需要知道如何取消这个活动,当我打电话或拒绝电话时.我是否打电话给EXTRA_STATE_IDLE?EXTRA_STATE_OFFHOOK?
有任何想法吗?
<receiver android:name=".IncomingBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
public class IncomingBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
// If an incoming call arrives
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING))
{ //Did my work }
Run Code Online (Sandbox Code Playgroud)
小智 25
拨打电话时,上述答案完全错误.在Android中,没有办法检测呼叫是否实际应答(如果是呼出呼叫).拨打号码的那一刻,off_hook
州就被解雇了.这是Android编程的缺点之一.
And*_*eas 21
在你的onReceive中:
PhoneStateChangeListener pscl = new PhoneStateChangeListener();
TelephonyManager tm = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(pscl, PhoneStateListener.LISTEN_CALL_STATE);
Run Code Online (Sandbox Code Playgroud)
单独的课程:
private class PhoneStateChangeListener extends PhoneStateListener {
public static boolean wasRinging;
String LOG_TAG = "PhoneListener";
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch(state){
case TelephonyManager.CALL_STATE_RINGING:
Log.i(LOG_TAG, "RINGING");
wasRinging = true;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(LOG_TAG, "OFFHOOK");
if (!wasRinging) {
// Start your new activity
} else {
// Cancel your old activity
}
// this should be the last piece of code before the break
wasRinging = true;
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i(LOG_TAG, "IDLE");
// this should be the last piece of code before the break
wasRinging = false;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您需要做的就是编写一些代码来检查以前的状态是否"振铃".如果当前状态为空闲且前一状态正在响铃,则他们取消了呼叫.如果当前状态是摘机并且之前的状态正在响铃,他们接听了电话.
以下是它在不同场景中经历的状态:
1)接听已接来电
CALL_STATE_RINGING => CALL_STATE_OFFHOOK (After Answering call) => CALL_STATE_IDLE (After End call)
Run Code Online (Sandbox Code Playgroud)
2)拒绝/不应答(未接)已接来电
CALL_STATE_RINGING => CALL_STATE_IDLE (After End call)
Run Code Online (Sandbox Code Playgroud)
3)拨打电话
CALL_STATE_OFFHOOK (After dialing) => CALL_STATE_IDLE (After End call)
Run Code Online (Sandbox Code Playgroud)
码
int prev_state=0;
public class CustomPhoneStateListener extends PhoneStateListener {
private static final String TAG = "CustomPhoneStateListener";
@Override
public void onCallStateChanged(int state, String incomingNumber){
if(incomingNumber!=null&&incomingNumber.length()>0) incoming_nr=incomingNumber;
switch(state){
case TelephonyManager.CALL_STATE_RINGING:
Log.d(TAG, "CALL_STATE_RINGING");
prev_state=state;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d(TAG, "CALL_STATE_OFFHOOK");
prev_state=state;
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.d(TAG, "CALL_STATE_IDLE==>"+incoming_nr);
NumberDatabase database=new NumberDatabase(mContext);
if((prev_state==TelephonyManager.CALL_STATE_OFFHOOK)){
prev_state=state;
//Answered Call which is ended
}
if((prev_state==TelephonyManager.CALL_STATE_RINGING)){
prev_state=state;
//Rejected or Missed call
}
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在你的接收器
onReceive(Context context, Intent intent) {
TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); //TelephonyManager object
CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener();
telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); //Register our listener with TelephonyManager
Bundle bundle = intent.getExtras();
String phoneNr= bundle.getString("incoming_number");
mContext=context;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
36572 次 |
最近记录: |