如何检测默认Dialer应用程序更改?

问题描述 投票:0回答:1

上下文

我正在实现RCC,正如GSMA在此规范中所看到的,我需要能够检测默认的拨号程序更改。

根据规范B.1.1节:

在高于或等于7.0的Android™OS版本上,将收到默认SMS应用程序更改和默认拨号程序更改通知(...),RCS客户端应收听Android™Intent的广播:“ 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个回答
0
投票

通过查看平台源代码(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()));

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

我想ACTION_DEFAULT_DIALER_CHANGED的文档可能使它更清晰。

© www.soinside.com 2019 - 2024. All rights reserved.