我想在几秒钟后结束新的拨出电话。这是我的代码:
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的新手,似乎无法让这个工作。
答案 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调用。已经有很多尝试这样做(据我所知没有成功),并且有一个响亮的“不要这样做!”来自社区。 p>
答案 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");