在安卓系统中如何结束通话

3
我正在尝试在几秒钟后结束一个新的呼出电话。以下是我的代码:

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个回答

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
如果您正在尝试在setResultData()之后结束呼叫(即通话中),我在这里发布了一个答案 - Paul Lammertsma

4
您无法在Android中结束通话。在您调用startActivity(callIntent)时,您正在将控制权交给本机呼叫应用程序。现在只能通过电话应用程序中止通话。

除此之外,您在启动通话后的代码没有太多意义。您没有对创建的ComponentName做任何操作,因此Receiver的onReceive方法将永远不会被调用。而且,即使接收器被调用,onReceive方法中的代码也不会对电话呼叫的状态进行任何更改。


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");

1

您可以启用飞行模式(需要适当的设置),然后在短时间内将其禁用。

当然,这将意味着短暂失去3G连接(几秒钟)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接