我們如何以編程方式知道我正在撥打的電話是在另一方接收的? 我知道有一些電話狀態,如IDLE,OFFHOOK和RINGING。 我希望收到我正在撥打的電話已收到,被對方斷開連接或對方無人看管。電話狀態
請建議。
我們如何以編程方式知道我正在撥打的電話是在另一方接收的? 我知道有一些電話狀態,如IDLE,OFFHOOK和RINGING。 我希望收到我正在撥打的電話已收到,被對方斷開連接或對方無人看管。電話狀態
請建議。
我的理解是,我們不能在各個國家之間的區分摘機狀態裏面,除非我們有內包裝訪問:然後你就可以做這樣的事情。
如果我們有內部軟件包訪問權限,那麼只有我們可以知道所連接的呼叫是實際接收還是錯過或由另一方斷開。
您需要一個PhoneStateListener。這樣可以檢查電話的狀態。您必須實施onCallStateChanged
。每次通話狀態發生變化時都會調用此方法。
switch(state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.d("Call","Outgoing Call finished");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.d("Call","Outgoing Call Starting");
break;
}
難道不是摘機狀態,是指所有的這些撥號,呼叫建立和呼叫掛?我如何區分這三者。在一個鏈接中,我看到OFFHOOK狀態僅表示呼叫已連接。請澄清。與呼叫連接的 – 2011-04-21 08:22:47
我的意思是對方拿起電話。我還想知道,如果直接斷開連接,對方可能沒有接聽電話。那我能知道嗎? – 2011-04-21 08:24:26
在這裏你可以看到這三個狀態的調用可以有:http://developer.android.com/reference/android/telephony/TelephonyManager.html – 2011-04-21 08:28:15
你必須使用廣播接收器具有以下的onReceive實施檢查phonestate改變
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
final Bundle extras = intent.getExtras();
if (intent.getAction().equals(
TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
final String state = extras.getString(TelephonyManager.EXTRA_STATE);
if ("IDLE".equals(state)){
//TODO
}
if ("OFFHOOK".equals(state)){
//TODO
}
if ("RINGING".equals(state)){
//TODO
}
}
}
如果你要檢查中間狀態,你可以添加例如狀態控制...
儘管在android電話管理器中只有三種可用狀態,但在電話呼叫中很容易識別所有情況的狀態。 所以我們在這裏接收來自android的3個事件,例如RINGING,OFFHOOK和IDLE。爲了獲得呼叫的等待狀態,我們需要定義我們自己的狀態,如RINGING,OFFHOOK,IDLE,FIRST_CALL_RINGING,SECOND_CALL_RINGING。
請認爲我們正在從android收到事件,我們將定義我們的電話州。
這裏是獲取呼叫狀態的方法onReceive廣播 - 接收方法而不註冊phonestatelistener並逃避其他併發症。看代碼。
public class CallListening extends BroadcastReceiver {
static CustomPhoneStateListener customPhoneListener;
private static final String TAG ="broadcast_intent";
public static String incoming_number;
private String current_state,previus_state,event;
public static Boolean dialog= false;
private Context context;
private SharedPreferences sp,sp1;
private SharedPreferences.Editor spEditor,spEditor1;
public void onReceive(Context context, Intent intent) {
//Log.d("intent_log", "Intent" + intent);
dialog=true;
this.context = context;
event = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
incoming_number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.d(TAG, "The received event : "+event+", incoming_number : " + incoming_number);
previus_state = getCallState(context);
current_state = "IDLE";
if(incoming_number!=null){
updateIncomingNumber(incoming_number,context);
}else {
incoming_number=getIncomingNumber(context);
}
switch (event) {
case "RINGING":
Log.d(TAG, "State : Ringing, incoming_number : " + incoming_number);
if((previus_state.equals("IDLE")) || (previus_state.equals("FIRST_CALL_RINGING"))){
current_state ="FIRST_CALL_RINGING";
}
if((previus_state.equals("OFFHOOK"))||(previus_state.equals("SECOND_CALL_RINGING"))){
current_state = "SECOND_CALL_RINGING";
}
break;
case "OFFHOOK":
Log.d(TAG, "State : offhook, incoming_number : " + incoming_number);
if((previus_state.equals("IDLE")) ||(previus_state.equals("FIRST_CALL_RINGING")) || previus_state.equals("OFFHOOK")){
current_state = "OFFHOOK";
}
if(previus_state.equals("SECOND_CALL_RINGING")){
current_state ="OFFHOOK";
startDialog(context);
}
break;
case "IDLE":
Log.d(TAG, "State : idle and incoming_number : " + incoming_number);
if((previus_state.equals("OFFHOOK")) || (previus_state.equals("SECOND_CALL_RINGING")) || (previus_state.equals("IDLE"))){
current_state="IDLE";
}
if(previus_state.equals("FIRST_CALL_RINGING")){
current_state = "IDLE";
startDialog(context);
}
updateIncomingNumber("no_number",context);
Log.d(TAG,"stored incoming number flushed");
break;
}
if(!current_state.equals(previus_state)){
Log.d(TAG, "Updating state from "+previus_state +" to "+current_state);
updateCallState(current_state,context);
}
}
public void startDialog(Context context) {
Log.d(TAG,"Starting Dialog box");
Intent intent1 = new Intent(context, NotifyHangup.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
public void updateCallState(String state,Context context){
sp = PreferenceManager.getDefaultSharedPreferences(context);
spEditor = sp.edit();
spEditor.putString("call_state", state);
spEditor.commit();
Log.d(TAG, "state updated");
}
public void updateIncomingNumber(String inc_num,Context context){
sp = PreferenceManager.getDefaultSharedPreferences(context);
spEditor = sp.edit();
spEditor.putString("inc_num", inc_num);
spEditor.commit();
Log.d(TAG, "incoming number updated");
}
public String getCallState(Context context){
sp1 = PreferenceManager.getDefaultSharedPreferences(context);
String st =sp1.getString("call_state", "IDLE");
Log.d(TAG,"get previous state as :"+st);
return st;
}
public String getIncomingNumber(Context context){
sp1 = PreferenceManager.getDefaultSharedPreferences(context);
String st =sp1.getString("inc_num", "no_num");
Log.d(TAG,"get incoming number as :"+st);
return st;
}
}
嗨,我可以確切知道它指的是哪個內部包? – user2199280 2013-07-16 06:34:36