我正在实现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_application
是Settings.Secure
中的隐藏常量)?
通过查看平台源代码(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
的文档可能使它更清晰。