在Android中结束通话

时间:2010-09-29 16:56:53

标签: android android-intent telephony

我想在几秒钟后结束新的拨出电话。这是我的代码:

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 个答案:

答案 0 :(得分:4)

您无法在Android中结束通话。在您调用startActivity(callIntent)时,您将放弃对本机调用者应用程序的控制。现在只能通过电话应用程序中止呼叫。

除了你开始通话后的代码没有多大意义。您没有对正在创建的ComponentName执行任何操作,因此永远不会调用Receiver的onReceive方法。此外,如果接收器被调用,onReceive方法中的代码将不会做任何改变电话呼叫状态的事情。

答案 1 :(得分: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)移动到延迟几秒钟的线程中,但我相信这没有效果的原因是因为意图已经执行并且调用已经开始。

唯一可行的方法就是在PhoneFactory中使用内部API调用。已经有很多尝试这样做(据我所知没有成功),并且有一个响亮的“不要这样做!”来自社区。

答案 2 :(得分:1)

您可以启用飞行模式(需要正确设置)并在不久之后禁用它。

当然这意味着短时间内(几秒钟)会失去3G连接。

答案 3 :(得分: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");