Android - 停止循环 NEW_OUTGOING_CALL 事件?

Posted

技术标签:

【中文标题】Android - 停止循环 NEW_OUTGOING_CALL 事件?【英文标题】:Android - stopping NEW_OUTGOING_CALL events from looping? 【发布时间】:2010-10-22 23:01:37 【问题描述】:

我有一个 BroadcastReceiver 正在捕获 ACTION_NEW_OUTGOING_CALL 事件。

onReceive() 方法中,我将提供的号码发送到新的ListActivity,用户可以从列表中选择各种新的目的地号码。

当用户从列表中选择一个新号码时,我将在 URI 字段中使用新号码启动一个新的 ACTION_CALL 意图。或者,结果可能是原始数字。

无论新号码是什么,都必须立即拨打,不再进行任何处理。

我怎样才能让BroadcastReceiver 知道不应再次处理这个结果数字?

【问题讨论】:

【参考方案1】:

我通过在我的BroadcastReceiver 中实施“绕过前缀”解决了这个问题。如果我的客户端应用程序想要直接呼叫一个号码,它只需在调用 ACTION_CALL Intent 之前添加前缀。

如果拨打的号码有(硬编码)前缀,BroadcastReceiver 会去除前缀并允许呼叫正常进行:

public void onReceive(Context context, Intent intent)

    String action = intent.getAction();
    if (Intent.ACTION_NEW_OUTGOING_CALL.equals(action)) 
        String number = getResultData();
        if (number.startsWith(BYPASS_PREFIX)) 
             setResultData(number.substring(BYPASS_PREFIX.length()));
         else 
             // do additional processing
        
    

这一次性解决了两个问题 - 这不仅停止了呼叫循环,还为我提供了一种方法,通过将前缀存储在电话簿条目中来绕过对特定号码的额外处理。

【讨论】:

嗨 Alnitak,我在 HTC Hero 上遇到了一个重大问题,我使用 setResultData(null) 来阻止呼叫,但它似乎没有正确阻止呼叫。它可以阻止它,但是它在使用的应用程序屏幕中出现了一个拨号器图标(按住主页键),当您单击它时,它似乎试图再次拨打电话然后消失,您遇到过这样的事情吗?在原版 android 中运行良好,但在 HTC Hero 上存在重大问题 我没有英雄。他们的特殊外壳也可能以比您的应用程序更高的优先级拦截出站呼叫尝试。尝试更改 BroadcastReceiver 的优先级。 但是通过这个我无法阻止特定号码的通话【参考方案2】:

广播接收器中的 onReceive() 方法接收一个 Intent 作为参数。 使用 Intent.getExtras() 从 Intent 中提取 Bundle。 此 Bundle 包含 3 个键值对,如下所示:

    android.phone.extra.ALREADY_CALLED = null android.intent.extra.PHONE_NUMBER = 98xxxxxx98 android.phone.extra.ORIGINAL_URI = 电话:98xxxxxx98

98xxxxxx98是用户拨打的号码。

当再次调用 onReceive() 时,这个数字变为 98xxxxxx98*0* 通过检查拨打号码末尾的星号(*),可以推断出onReceive()方法是第一次调用还是后续调用。

【讨论】:

以上是关于Android - 停止循环 NEW_OUTGOING_CALL 事件?的主要内容,如果未能解决你的问题,请参考以下文章

调用 stop() 和 release() android 后声音不会停止

Android soundpool 循环逻辑

循环启动和停止时蓝牙 LE 广告失败

Android信号量停止线程

如何在Android中停止可运行线程?

使用 Qt 5.3 或 Qt 5.4(但不是 Qt 5.2)编译时,QGuiApplication 在手机锁定时停止事件循环