2010-09-29 123 views
3

我試圖在幾秒鐘後結束新的傳出呼叫。這裏是我的代碼:在Android中結束呼叫

public class phonecalls extends Activity { 
    ComponentName cn; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     call(); 
    } 
    private void call() { 
     try { 
      Intent callIntent = new Intent(Intent.ACTION_CALL); 
      callIntent.setData(Uri.parse("tel:123456789")); 
      startActivity(callIntent); 
      cn = new ComponentName(getApplicationContext(), Receiver.class); 
     } catch (ActivityNotFoundException activityException) { 
      Log.e("dialing-example", "Call failed", activityException); 
     } 
    } 
} 

我的接收器類:

public class Receiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { 
      setResultData(null); 
     } 
    } 
} 

我無法中止呼出。我是Android新手,似乎無法使其工作。

回答

4

您無法在Android中結束通話。目前你正在調用startActivity(callIntent),你放棄了對本地調用者應用程序的控制。現在只能通過電話應用程序中止通話。

除了開始通話後你的代碼沒有多大意義。你沒有對你正在創建的ComponentName做任何事情,所以你的Receiver的onReceive方法將永遠不會被調用。另外,如果接收方會被調用,onReceive方法中的代碼將不會做任何事情來改變電話的狀態。

4

BroadcastReceiver類應攔截所有呼叫。檢查接收器類在AndroidManifest.xml正確註冊:

<receiver android:name="Receiver" android:exported="true" android:enabled="true"> 
    <intent-filter android:priority="1"> 
     <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</receiver> 

這麼說,我不相信這是可能接收函數完成後取消呼叫。我試着將setResultData(null)移到一個延遲幾秒的線程中,但我相信這個沒有效果的原因是因爲意圖已經被執行並且調用已經開始。

這可能是唯一的方法是讓您的手髒內部API調用PhoneFactory。有很多嘗試做到這一點(據我所知沒有成功),並有一個響亮的「不要這樣做!」來自社區。

+2

如果你試圖結束後撥'setResultData()'(即呼叫),[我已經張貼在這裏的答案](HTTP://計算器。 COM /問題/ 599443/Android系統如何對掛起-傳出呼叫/ 5314372#5314372)。 – 2011-06-27 21:50:01

1

您可以啓用飛行模式(需要適當的設置)並在不久之後將其禁用。

當然,這意味着短時間內(幾秒鐘)會丟失3G連接。

1

我的解決方案

Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);    
buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK)); 
getContext().sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");