android4.4 获取符合默认短信应用要求的短信应用包名(改进篇)
从上一篇获取符合默认短信应用来看,获取思路是正确的,但是还很不完善,但是这归根结底是google整出来的一套规范,如何去找到符合规范的应用呢,这得google告诉我们。
因此,我看了一下android源码,关键是SmsApplication中的SmsApplicationData, 里面有个函数叫getApplicationCollection(Context context),这就是android4.4中系统用于获取符合默认短信应用要求的应用信息的代码,如下:
/*** Returns the list of available SMS apps defined as apps that are registered for both the* SMS_RECEIVED_ACTION (SMS) and WAP_PUSH_RECEIVED_ACTION (MMS) broadcasts (and their broadcast* receivers are enabled)** Requirements to be an SMS application:* Implement SMS_DELIVER_ACTION broadcast receiver.* Require BROADCAST_SMS permission.** Implement WAP_PUSH_DELIVER_ACTION broadcast receiver.* Require BROADCAST_WAP_PUSH permission.** Implement RESPOND_VIA_MESSAGE intent.* Support smsto Uri scheme.* Require SEND_RESPOND_VIA_MESSAGE permission.** Implement ACTION_SENDTO intent.* Support smsto Uri scheme.*/public static Collection<SmsApplicationData> getApplicationCollection(Context context) {PackageManager packageManager = context.getPackageManager();// Get the list of apps registered for SMSIntent intent = new Intent(Intents.SMS_DELIVER_ACTION);List<ResolveInfo> smsReceivers = packageManager.queryBroadcastReceivers(intent, 0);HashMap<String, SmsApplicationData> receivers = new HashMap<String, SmsApplicationData>();// Add one entry to the map for every sms receiver (ignoring duplicate sms receivers)for (ResolveInfo resolveInfo : smsReceivers) {final ActivityInfo activityInfo = resolveInfo.activityInfo;if (activityInfo == null) {continue;}if (!permission.BROADCAST_SMS.equals(activityInfo.permission)) {continue;}final String packageName = activityInfo.packageName;if (!receivers.containsKey(packageName)) {final String applicationName = resolveInfo.loadLabel(packageManager).toString();final SmsApplicationData smsApplicationData = new SmsApplicationData(applicationName, packageName, activityInfo.applicationInfo.uid);smsApplicationData.mSmsReceiverClass = activityInfo.name;receivers.put(packageName, smsApplicationData);}}// Update any existing entries with mms receiver classintent = new Intent(Intents.WAP_PUSH_DELIVER_ACTION);intent.setDataAndType(null, "application/vnd.wap.mms-message");List<ResolveInfo> mmsReceivers = packageManager.queryBroadcastReceivers(intent, 0);for (ResolveInfo resolveInfo : mmsReceivers) {final ActivityInfo activityInfo = resolveInfo.activityInfo;if (activityInfo == null) {continue;}if (!permission.BROADCAST_WAP_PUSH.equals(activityInfo.permission)) {continue;}final String packageName = activityInfo.packageName;final SmsApplicationData smsApplicationData = receivers.get(packageName);if (smsApplicationData != null) {smsApplicationData.mMmsReceiverClass = activityInfo.name;}}// Update any existing entries with respond via message intent class.intent = new Intent(TelephonyManager.ACTION_RESPOND_VIA_MESSAGE,Uri.fromParts("smsto", "", null));List<ResolveInfo> respondServices = packageManager.queryIntentServices(intent, 0);for (ResolveInfo resolveInfo : respondServices) {final ServiceInfo serviceInfo = resolveInfo.serviceInfo;if (serviceInfo == null) {continue;}if (!permission.SEND_RESPOND_VIA_MESSAGE.equals(serviceInfo.permission)) {continue;}final String packageName = serviceInfo.packageName;final SmsApplicationData smsApplicationData = receivers.get(packageName);if (smsApplicationData != null) {smsApplicationData.mRespondViaMessageClass = serviceInfo.name;}}// Update any existing entries with supports send to.intent = new Intent(Intent.ACTION_SENDTO,Uri.fromParts("smsto", "", null));List<ResolveInfo> sendToActivities = packageManager.queryIntentActivities(intent, 0);for (ResolveInfo resolveInfo : sendToActivities) {final ActivityInfo activityInfo = resolveInfo.activityInfo;if (activityInfo == null) {continue;}final String packageName = activityInfo.packageName;final SmsApplicationData smsApplicationData = receivers.get(packageName);if (smsApplicationData != null) {smsApplicationData.mSendToClass = activityInfo.name;}}// Remove any entries for which we did not find all required intents.for (ResolveInfo resolveInfo : smsReceivers) {final ActivityInfo activityInfo = resolveInfo.activityInfo;if (activityInfo == null) {continue;}final String packageName = activityInfo.packageName;final SmsApplicationData smsApplicationData = receivers.get(packageName);if (smsApplicationData != null) {if (!smsApplicationData.isComplete()) {receivers.remove(packageName);}}}return receivers.values();}/*** Checks to see if we have a valid installed SMS application for the specified package name* @return Data for the specified package name or null if there isn't one*/private static SmsApplicationData getApplicationForPackage(Collection<SmsApplicationData> applications, String packageName) {if (packageName == null) {return null;}// Is there an entry in the application list for the specified package?for (SmsApplicationData application : applications) {if (application.mPackageName.contentEquals(packageName)) {return application;}}return null;}
从源码的实现来看,我上一篇关于这个功能的blog思路相当正确,只不过没用让它几个条件同时满足,因此,若我们需要获取符合默认短信应用要求的短信应用包名的话,我们只要原原本本地把源码搞出来用就行了
由于这个是隐藏的类和函数,我们获取不到,用反射又会相当麻烦,直接把实现给拷出来不失为一个良策。
要判断拿到的collection中的某一个是不是完全符合默认短信应用的要求怎么办呢?调用一下SmsApplication.isComplete()就OK了。
android4.4 获取符合默认短信应用要求的短信应用包名(改进篇)相关推荐
- android4.4 获取符合默认短信应用要求的短信应用包名
android 4.4有一坨更新,短信机制改变是更新里面的一项重头戏 怎样让短信应用适用于4.4官网那篇博客已经被翻译然后转载了N遍,我就随便贴一个链接上来吧4.4短信应用变更 这里我不是要说明怎样去 ...
- iOS获取已安装的app列表(私有库)+ 通过包名打开应用
1.获取已安装的app列表 - (void)touss {Class lsawsc = objc_getClass("LSApplicationWorkspace");NSObje ...
- 如何获取Android的apk的包名及其入口
0. 前提 已经配置好adb环境,没配置好的话可以参考博客配置adb环境变量配置一下. 1. 通过.apk获取APP的包名和Activity 1.1 找到aapt文件 资源管理器搜索栏输入%ANDRO ...
- 使用阿里云短信验证码API发送短信验证码(配置,获取短信验证码,注册,登录,密码重置)
获取阿里云短信验证码需要的配置信息. 如果是新用户,可以免费领取3个月,老用户的话就只能购买了,但是也不贵. 申请短信签名 申请短信模板 编写发送短信验证码的工具类 代码中我已经进行了详细的注释,也写 ...
- WordPress主题zibll子比主题+新增阿里云短信/腾讯云/短信宝/风吹雨短信接口
介绍: WordPress主题zibll子比主题–版本V5.1版 新增用户登录/注册/找回密码页面及多项对应设置(自动生成无需设置) 新增默认登录为弹框或页面的选项 新增登录框左侧图像显示功能(支持多 ...
- 一信通短信接口对接_短信接口对接流程
下面是php开发语言短信接口接入到项目中的demo示例: // ① 该代码仅供接入动力思维乐信短信接口参考使用,客户可根据实际需要自行编写: // ② 支持发送验证码短信.触发通知短信等: // ③ ...
- 关于调用阿里云短信服务接口实现短信验证码的过程
为了实现给手机发送短信来进行验证码验证,所以需要调用此接口来进行测试 登陆阿里云 首先需要有阿里云的账号,进行注册申请,进去控制台,然后找到短信服务 创建签名和模板 选中国内消息,然后看到右边有签名管 ...
- 怎么样可以调用阿里云短信服务接口实现短信验证码
为了实现给手机发送短信来进行验证码验证,所以需要调用此接口来进行测试 登陆阿里云 首先需要有阿里云的账号,进行注册申请,进去控制台,然后找到短信服务 创建签名和模板 选中国内消息,然后看到右边有签名管 ...
- SpringBoot+阿里云短信服务实现发送短信验证码功能
目录 一.登陆阿里云,开通短信服务(收费的,需要充值,1元能发20条左右),并获取AccessKeyId和AccessKeySecret 二.创建短信模板与签名 三.引入依赖 四.准备工作已完成,编码 ...
最新文章
- Java面试题(一)部分题目
- 资源 | 盘点国外NLP领域40大高校及相关知名学者
- 阿里老P8,被大学天天打游戏的室友吊打了!
- CVPR 2021 | pixelNeRF:一种基于NeRF的多视图三维重建网络
- JAVA数据结构知识点,数据结构 树Tree 知识点总结 附Leetcode力扣练习题答案
- java ide 2017_Intellij ide 2017.2新建javaweb项目,并且部署
- 【代码片段】base样式--针对bootstrap
- debian NO_PUBKEY 8B48AD6246925553 解决方法
- 如果某一运行的服务在/var/lock/subsys
- android 无法显示SD卡目录,Android studio无法在SD卡上创建新目录?
- 字符串基础类型拓宽的操作,转换成整数值
- CDH6.2 Linux离线安装
- Mac快速解压zip文件的两种方法
- 数据库系统概论-作业(设计本科生事务管理数据库)
- VS2013各版本密钥
- 极路由b70官方固件
- 服务器cpu虚拟化怎么开启,开启cpu虚拟化
- Check Point R80.10 SmartConsole汉化生成中文报表
- 软件体系结构——面向对象风格
- ssm毕设项目民宿预定管理系统20sxh(java+VUE+Mybatis+Maven+Mysql+sprnig)