[英]How to detect Default Dialer app changes?
我正在实施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
class 是一个空的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()));
它不会向所有感兴趣的 BroadcastReceiver 发送广播,而是调用sendBroadcastAsUser(Intent intent, UserHandle user)
,这只会将其发送给当前用户(即应用程序)。
我想ACTION_DEFAULT_DIALER_CHANGED
的文档可以使它更清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.