【问题标题】:Call receiver does not receive extras from phone intent呼叫接收者没有收到来自电话意图的额外信息
【发布时间】:2015-07-01 15:16:24
【问题描述】:

我有一个打电话的活动:

public void call(String number) {
    Intent intent = new Intent("android.intent.action.CALL");
    intent.setData(Uri.parse("tel:" + number));
    intent.putExtra("MY_EXTRA", "Hello");
    startActivity(intent);
    finish();
}

我为通话设置了广播接收器:

public class OutgoingCallReceiver extends BroadcastReceiver {
    @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("Extra", intent.getStringExtra("MY_EXTRA", "Default"));
        }
    }
}

并注册:

<receiver android:name=".OutgoingCallReceiver">
    <intent-filter android:priority="-1">
        <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</receiver>

广播接收器工作。但不管是从拨号器还是从我的Activity接收事件,都没有多余的。

为什么临时演员没有通过?

【问题讨论】:

    标签: android android-intent broadcastreceiver phone-call android-dialer


    【解决方案1】:

    它不是那样工作的。您不能向“ACTION_CALL”Intent 添加任意附加内容,并期望这些附加内容会出现在广播的“NEW_OUTGOING_CALL”Intent 中。您无法将自己的附加内容添加到“NEW_OUTGOING_CALL”广播Intent。您只能获得拨号器放入 Intent 的附加信息(如电话号码)。

    【讨论】:

    • 为什么?是否有理由剥夺价值?有什么来源可以告诉我吗?
    • 这不是“剥离值”。 2 个Intents 完全不同。第一个是Intent,用于启动Activity。这将启动拨号器应用程序。第二个是广播Intent,由系统的完全不同部分(底层调用框架)发送。
    • 所以作为一般经验法则,发送广播意图会去除额外内容?并且向android.intent.action.CALL 发送意图是广播意图?
    • 没有。附加功能在广播Intents 中工作正常。你错过了重点。我们正在谈论 2 个单独的 Intents。看看你的代码。您使用包含android.intent.action.CALLIntent 调用startActivity()。这会启动一个Activity(通常是系统拨号程序,但也可以是其他 3rd 方应用程序,例如 Skype 或其他)。在某些时候,底层调用框架决定它需要进行调用,然后它发送一个有序的广播Intentandroid.intent.action.NEW_OUTGOING_CALL
    • 您在 CALL Intent 中添加的随机附加信息会被拨号程序忽略,因为它不会期望它们并且不知道如何处理它们。它们不会被复制到Intent 广播中,因为没有人知道它们,而这不是这种工作方式。
    【解决方案2】:

    一切似乎都很好,但正如我所见:

    http://developer.android.com/reference/android/content/Intent.html#getStringExtra(java.lang.String)

    intent.getStringExtra("MY_EXTRA")
    

    接受一个参数,没有像 getIntExtra() 等的默认值...

    【讨论】:

      【解决方案3】:

      您发送的意图永远不会被广播接收器捕获。它触发调用,发送它自己的广播意图。

      来电者无视您发送给它的任何其他附加信息;它不知道如何处理它们。

      您可以尝试使用SharedPreferences 来保存发送意图的 Activity 和 BroadcastReciever 之间的状态。

      【讨论】:

        猜你喜欢
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-09
        相关资源
        最近更新 更多