gpt4 book ai didi

android - 循环时处理 NEW_OUTGOING_CALL Action 的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:16 24 4
gpt4 key购买 nike

目前我正在开发一个应用程序,它在 BroadcastReceiver 的帮助下捕获 NEW_OUTGOING_CALL 操作。我通过调用 setResultData(null) 中止调用。之后,我向用户展示了一个对话框,允许他决定是否要使用我的应用程序来重写它的号码。当用户决定发生时,我将根据决定调用新电话。现在我的广播接收器再次被调用。

知道我已经处理了号码的正确方法是什么?我得到了一个工作解决方案,它使用时间戳来猜测它是否已经被处理。另一种解决方案是在已处理号码的末尾添加 "+"。这些方法适用于我的应用程序,它是唯一一个捕获 NEW_OUTGOING_CALL 事件的应用程序。但是,当其他应用程序(如 Sipdroid 或 Google Voice)也坐在那里接收 NEW_OUTGOING_CALL 广播并中止并重新启动时,我该怎么办?我看不到有可能知道我们是否仍在同一个“调用流程”中,以及我是否已经处理了该号码。

我很想听听您对这个问题的看法!

最佳答案

您使用的 API 级别是多少?如果它 >= 11,请检查新的 BroadcastReceiver.goAsync 函数,它允许您将广播处理扩展到接收器的 onReceive 函数之外。这可以绕过完全循环的需要。

如果您像我一样在第 11 级之前尝试执行此操作,那么优雅地执行此操作会非常棘手。您可能也这样做了,但我试图在我的代码生成的 ACTION_CALL Intent 中包含一个“已处理”标志作为额外内容,希望它能以某种方式包含在生成的 ACTION_NEW_OUTGOING_CALL 广播中,但遗憾的是这不起作用。

我找到的最佳解决方案是在您生成的 ACTION_CALL Intent 的 URI 中包含一个 fragment 。此 fragment 将包含在生成的 ACTION_NEW_OUTGOING_CALL 广播中,因此您的广播接收器可以区分原始调用和您生成的调用,但它不会干扰不寻找它的处理程序。

这是基本代码。

在 ACTION_NEW_OUTGOING_CALL 的 BroadcastReceiver 中

public class YourBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// extract the fragment from the URI
String uriFragment = Uri.parse(
intent.getStringExtra("android.phone.extra.ORIGINAL_URI")).getFragment();

// if the fragment is missing or does not have your flag, it is new
if (uriFragment == null || !uriFragment.contains("your_flag")) {

// launch your activity, pass the phone number, etc.
// use getResultData to get the number in order to respect
// earlier broadcast receivers
...

// abort the broadcast
this.setResultData(null);
this.abortBroadcast();
}
// otherwise, your code is there, this call was triggered by you
else {
// unless you have a special need, you'll probably just let the broadcast
// go through here

// note that resultData ignores the fragment, so other receivers should
// be blissfully unaware of it
}
}
}

当用户第一次调用该号码时,该 fragment 要么完全丢失,要么您的标志不存在,因此您将中止广播并开始您的 Activity 。在您的 Activity 中,如果您决定再次调用电话,请执行以下操作:

startActivity(new Intent(Intent.ACTION_CALL,
Uri.parse("tel:" + modified_number + "#your_flag")));

“your_flag” fragment 将出现在随后的 NEW_OUTGOING_CALL 广播中,因此您可以在广播接收器中以不同方式处理这种情况。

这样做的好处是 fragment 会被完全忽略,除非您在 ORIGINAL_URI 中查找它,因此其他广播接收器可以继续运行。如果你想变得非常友善,你可能想要寻找一个现有的 fragment 并向其添加你的标志(可能使用逗号分隔符)。

希望对您有所帮助。祝你好运!

关于android - 循环时处理 NEW_OUTGOING_CALL Action 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3243635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com