从上一篇获取符合默认短信应用来看,获取思路是正确的,但是还很不完善,但是这归根结底是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 获取符合默认短信应用要求的短信应用包名(改进篇)相关推荐

  1. android4.4 获取符合默认短信应用要求的短信应用包名

    android 4.4有一坨更新,短信机制改变是更新里面的一项重头戏 怎样让短信应用适用于4.4官网那篇博客已经被翻译然后转载了N遍,我就随便贴一个链接上来吧4.4短信应用变更 这里我不是要说明怎样去 ...

  2. iOS获取已安装的app列表(私有库)+ 通过包名打开应用

    1.获取已安装的app列表 - (void)touss {Class lsawsc = objc_getClass("LSApplicationWorkspace");NSObje ...

  3. 如何获取Android的apk的包名及其入口

    0. 前提 已经配置好adb环境,没配置好的话可以参考博客配置adb环境变量配置一下. 1. 通过.apk获取APP的包名和Activity 1.1 找到aapt文件 资源管理器搜索栏输入%ANDRO ...

  4. 使用阿里云短信验证码API发送短信验证码(配置,获取短信验证码,注册,登录,密码重置)

    获取阿里云短信验证码需要的配置信息. 如果是新用户,可以免费领取3个月,老用户的话就只能购买了,但是也不贵. 申请短信签名 申请短信模板 编写发送短信验证码的工具类 代码中我已经进行了详细的注释,也写 ...

  5. WordPress主题zibll子比主题+新增阿里云短信/腾讯云/短信宝/风吹雨短信接口

    介绍: WordPress主题zibll子比主题–版本V5.1版 新增用户登录/注册/找回密码页面及多项对应设置(自动生成无需设置) 新增默认登录为弹框或页面的选项 新增登录框左侧图像显示功能(支持多 ...

  6. 一信通短信接口对接_短信接口对接流程

    下面是php开发语言短信接口接入到项目中的demo示例: // ① 该代码仅供接入动力思维乐信短信接口参考使用,客户可根据实际需要自行编写: // ② 支持发送验证码短信.触发通知短信等: // ③ ...

  7. 关于调用阿里云短信服务接口实现短信验证码的过程

    为了实现给手机发送短信来进行验证码验证,所以需要调用此接口来进行测试 登陆阿里云 首先需要有阿里云的账号,进行注册申请,进去控制台,然后找到短信服务 创建签名和模板 选中国内消息,然后看到右边有签名管 ...

  8. 怎么样可以调用阿里云短信服务接口实现短信验证码

    为了实现给手机发送短信来进行验证码验证,所以需要调用此接口来进行测试 登陆阿里云 首先需要有阿里云的账号,进行注册申请,进去控制台,然后找到短信服务 创建签名和模板 选中国内消息,然后看到右边有签名管 ...

  9. SpringBoot+阿里云短信服务实现发送短信验证码功能

    目录 一.登陆阿里云,开通短信服务(收费的,需要充值,1元能发20条左右),并获取AccessKeyId和AccessKeySecret 二.创建短信模板与签名 三.引入依赖 四.准备工作已完成,编码 ...

最新文章

  1. Java面试题(一)部分题目
  2. 资源 | 盘点国外NLP领域40大高校及相关知名学者
  3. 阿里老P8,被大学天天打游戏的室友吊打了!
  4. CVPR 2021 | pixelNeRF:一种基于NeRF的多视图三维重建网络
  5. JAVA数据结构知识点,数据结构 树Tree 知识点总结 附Leetcode力扣练习题答案
  6. java ide 2017_Intellij ide 2017.2新建javaweb项目,并且部署
  7. 【代码片段】base样式--针对bootstrap
  8. debian NO_PUBKEY 8B48AD6246925553 解决方法
  9. 如果某一运行的服务在/var/lock/subsys
  10. android 无法显示SD卡目录,Android studio无法在SD卡上创建新目录?
  11. 字符串基础类型拓宽的操作,转换成整数值
  12. CDH6.2 Linux离线安装
  13. Mac快速解压zip文件的两种方法
  14. 数据库系统概论-作业(设计本科生事务管理数据库)
  15. VS2013各版本密钥
  16. 极路由b70官方固件
  17. 服务器cpu虚拟化怎么开启,开启cpu虚拟化
  18. Check Point R80.10 SmartConsole汉化生成中文报表
  19. 软件体系结构——面向对象风格
  20. ssm毕设项目民宿预定管理系统20sxh(java+VUE+Mybatis+Maven+Mysql+sprnig)

热门文章

  1. anistropic filer
  2. 利用C++实现简单的文件加密
  3. word打开文件出错怎么办?
  4. 【学习笔记】NIM游戏与SG函数初探
  5. 小程序 uni canvas绘制圆角图片 圆角矩形
  6. Django Model 定义语法
  7. 入学校计算机社团申请书,学校社团成立申请书
  8. vscode 程序员鼓励师_程序员鼓励师插件Rainbow Fart(彩虹屁)
  9. jmeter压测学习47-发soap请求测试webservice接口
  10. 2022-2028年中国眼镜制造行业市场竞争策略及未来发展潜力报告