1

我有多个应用程序。当我从一个人打来电话时,我不希望其他任何人(如果在电话上,可能会或可能不会)拦截它。这样做时

Intent dialIntent = new Intent(Intent.ACTION_CALL, phoneNumber);
startActivity(dialIntent);

是否有一个标志我可以发送说“忽略除本机拨号程序之外的所有广播接收器”?

(我想我可以将数据添加到意图中,例如 dialIntent.putExtra("cameFromMyApp", "ignoreMe") 并在我所有的接收器中检查它,如果没有,Android 拨号器将忽略额外的数据,但是这样做的标志会简单得多。)

4

3 回答 3

1

我认为你在这里混淆了一些东西(活动Intent和广播Intent)。让我试着帮忙。

当你这样做时:

Intent dialIntent = new Intent(Intent.ACTION_CALL, phoneNumber);
startActivity(dialIntent);

这会导致 Android 寻找Activity已宣传他们可以处理的可用 s ACTION_CALL。标准的 Android 拨号器就是其中之一,但手机上可能还安装了其他拨号器。如果只有一个,则启动该 Activity。如果有多个,则向用户显示可能的活动列表,并且用户可以选择他想要使用的活动。Intent如果您发送的是隐式Intent(即:未指定组件),则您无法控制此行为。

现在让我们假设选择了标准的 Android 拨号器应用程序。它使用 发送有序广播Intent.ACTION_NEW_OUTGOING_CALL。此广播将按顺序发送给所有BroadcastReceiver已注册此广播的 s。这使这些组件有机会修改号码、拨打号码或阻止呼叫。您也无法控制此行为。

要强制使用标准 Android 拨号器,您需要使用显式Intent(即:指定组件名称)。问题是每个制造商和/或移动运营商都可以提供一个自定义拨号器,而不是标准的 Android 拨号器,因此这不适用于所有手机。

然而,正如我之前所说,即使您可以确定标准的 Android 拨号器会启动,它仍然会发送有序广播,允许其他组件修改、拨号或阻止呼叫。

于 2013-05-07T18:10:44.807 回答
1

如果您找到所需的本机拨号程序的包名称,则可以仅调用该特定拨号程序并传递所需的意图附加信息。这里有一些未经测试的代码来帮助说明我的意思:

    String number = "111-333-222-4";

    String uri = "tel:" + number.trim() ;

    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setPackage("com.mydialler.package.name");
    intent.setData(Uri.parse(uri));
    startActivity(intent);

请注意,不同的电话运营商会添加自己的拨号器,以便他们拥有自己的包裹名称。

编辑 - 我意识到上面的代码假设您可以访问该类,因此使用不同的方法编辑代码来设置包名称。请注意,您还可以使用此方法获取启动意图并在之后调整意图数据:

   PackageManager pm = getPackageManager();
   Intent intent = pm.getLaunchIntentForPackage("com.mydialler.package");
于 2013-05-07T16:20:48.930 回答
0

用这个

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + url));
    intent.setClassName("com.android.phone", "com.android.phone.OutgoingCallBroadcaster");

    startActivity(intent);
于 2017-03-08T13:04:09.797 回答