【问题标题】:How to detect Default Dialer app changes?如何检测默认拨号器应用程序更改?
【发布时间】:2019-10-07 11:52:25
【问题描述】:

上下文

我正在实施RCC,正如 GSMA 在本规范中所见,我需要能够检测默认拨号器更改。

根据规范 B.1.1 部分:

在高于或等于 7.0 的 Android™ OS 版本上,(...) 要通知默认 SMS 应用程序更改和默认拨号程序更改,RCS 客户端应侦听 Android™ Intents 的广播:“ACTION_DEFAULT_SMS_PACKAGE_CHANGED”。 “ACTION_DEFAULT_DIALER_CHANGED”

目前,我在这样的示例项目中使用 TelecomManager.ACTION_DEFAULT_DIALER_CHANGED

<receiver android:name="BroadcastTest">
  <intent-filter>
    <action android:name="android.telecom.action.DEFAULT_DIALER_CHANGED"/>
  </intent-filter>
</receiver>

BroadcastTest 类是打印日志的空 BroadcastReceiver

问题

在设置中更新拨号器应用时,接收器中没有收到广播。我尝试使用优先级,但也没有成功。如果应用程序发出请求,我将收到广播,但是,如果用户也更改了设置(或使用其他应用程序),我需要执行一些行为。

这个广播好像没有被发送,这使得这个规范的实现变得困难。

相关应用具有通话权限。无论应用是否为默认拨号器,都不会收到广播。

解决方法

我想出了一个解决方法,它涉及注册一个内容观察者,以便在 dialer_default_application URI (content://settings/secure/dialer_default_application) 发生更改时收到通知。

但是,按照规范中的定义,我们应该会收到这个广播

问题

执行此广播时我做错了什么吗?是否有人收到此广播(可能是特定于设备的问题)?使用变通方案是否有问题(dialer_default_applicationSettings.Secure 中的隐藏常量)?

【问题讨论】:

    标签: android broadcastreceiver telephonymanager


    【解决方案1】:

    通过查看平台源代码 (TelephonyServiceImpl class),您所描述的行为似乎符合预期:

    final Intent intent = new Intent(TelecomManager.ACTION_DEFAULT_DIALER_CHANGED);
    intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName);
    mContext.sendBroadcastAsUser(intent, new UserHandle(ActivityManager.getCurrentUser()));
    

    它不会向所有感兴趣的 BroadcastReceiver 发送广播,而是调用sendBroadcastAsUser(Intent intent, UserHandle user),这只会将其发送给当前用户(即应用程序)。

    我想ACTION_DEFAULT_DIALER_CHANGED 的文档可能会更清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2017-06-27
      • 1970-01-01
      • 2016-12-02
      • 2016-10-15
      相关资源
      最近更新 更多