2013-02-15 114 views
1

我想用我的程序拨打电话,然后识别通话状态。我想要检测外出铃声的结束。如何检测出局铃声结束?

如何检测出局铃声结束?

我使用流程代码进行调用。

EditText ed = (EditText) findViewById(R.id.txtcall);   
Uri uri = Uri.fromParts("tel", ed.getText().toString(), null); 
callIntent = new Intent(Intent.ACTION_CALL,uri); 
startActivity(callIntent); 

回答

0

检查由本: - 你将能够调用用户

Intent callIntent = new Intent(Intent.ACTION_CALL); 
callIntent.setData(Uri.parse("tel:+9189745847")); 
startActivity(callIntent); 

,并在AndroidManifest.xml文件还使用:

<uses-permission android:name="android.permission.CALL_PHONE" /> 
+0

非常感谢。我想检测传出铃声结束。我可以做到这一点吗? – 2013-02-15 07:36:15

0

看一看意图NEW_OUTGOING_CALL

<receiver android:name=".receiver.OutgoingCallReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     </intent-filter> 
    </receiver> 

然后你可以检查t他通话的状态与PhoneStateListener:

public class OutgoingCallReceiver extends BroadcastReceiver { 

protected static final String CLASS_TAG = "OutgoingCallReceiver : "; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 
    if(null == bundle) return; 

    String phonenumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 
    Log.i(LOG_TAG, CLASS_TAG + "phone number " + phonenumber); 

     final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
     tm.listen(new PhoneStateListener() { 
      @Override 
      public void onCallStateChanged(int state, String incomingNumber) { 
       switch (state) { 
       case TelephonyManager.CALL_STATE_RINGING: 
        Log.d(LOG_TAG, CLASS_TAG + "RINGING"); 
        break; 
       case TelephonyManager.CALL_STATE_OFFHOOK: 
        Log.d(LOG_TAG, CLASS_TAG + "OFFHOOK"); 
        Process.onCallStateIsOFFHOOK(); 
        break; 
       case TelephonyManager.CALL_STATE_IDLE: 
        Process.onCallStateIsIDLE(); 
        Log.d(LOG_TAG, CLASS_TAG + "IDLE"); 
        break; 
       default: 
        Log.d(LOG_TAG, CLASS_TAG + "Default: " + state); 
        break; 
       } 
      } 
     }, PhoneStateListener.LISTEN_CALL_STATE); 
    } 
} 

在Process类,你可以检测铃声和创造更多像CALLBEGINS状态,通过记录VOICE_CALL CALLANSWERED。 onCallStateIsIDLE()的 例子:

public void onCallStateIsIDLE() { 
    setSpeakingOn(false); 
    if (stateCall == STATE_CALLANSWERED || 
      stateCall == STATE_CALLBEGINS || 
      stateCall == STATE_DIALISOFFHOOK || 
      stateCall == STATE_DIALENDREQUESTED) { 
     Log.i(LOG_TAG, CLASS_TAG + " - forcing state : STATE_DIALREADY : old state = " + stateCall); 
     stateCall = STATE_DIALREADY; 
    } 
} 
+0

请详细解释流程类。 – 2013-02-15 14:17:41

1

下面的代码片段可以帮助你找到电话当前是否雕像拿起它,振铃或空闲。您可以轻松使用这些状态并相应地实现您的功能。

private class CustomPhoneStateListener extends PhoneStateListener 
{   
      @Override 
      public void onCallStateChanged(int state, String incomingNumber) 
      { 
       super.onCallStateChanged(state, incomingNumber); 

       //TelephonyManager.CALL_STATE_IDLE 
       //TelephonyManager.CALL_STATE_OFFHOOK 
       //TelephonyManager.CALL_STATE_RINGING 
      } 
} 
+0

请给我一些更多的解释 – 2013-02-15 14:16:38

+0

只需拨打电话,然后,每当你发现呼叫状态是CALL_STATE_IDLE,意味着其被拒绝或铃声结束在另一边。 – 2013-02-18 08:48:25