博主参加了2013博客之星评选,谢谢你的的支持,投票猛击:

http://vote.blog.csdn.net/blogstaritem/blogstar2013/xyz_lmn

Android团队通过Android开发博客透漏今年会放出Android 4.4 (KitKat) ,同时更新了 SMS 的部分API。博客上讲只有default SMS app才能对短信数据库有写权限,但是用户可以把第三方应用设置为default SMS app。有些中文的报道说“在Android 4.4中,只有默认的信息应程序才有权限接收和发送短信”,本文作者认为是不完全正确的,非default SMS app也能读写短信,只不过是不能写入短信数据库中。我们看一看android开发者博客是怎么讲述其他应用短信接收和发送问题的。

1)接收短信问题:

Other apps that only want to read new messages can instead receive the
SMS_RECEIVED_ACTION broadcast intent when a new SMS arrives. 

其他应用可以接收SMS_RECEIVED_ACTION的广播接收到短信,接收到这个广播,短信不会写入短信数据库。

2)发送短信问题:

When your app is not currently selected as the default SMS app, it's important that you
disable the ability to send new messages from your app because, without the ability to
write to the SMS Provider, any messages you send won't be visible in the user's default SMS app.

没有default SMS app能力的app发送短信,不会出现在短信数据库中。

Android开发者博客中重点讲到了3个方面的问题:

1、怎么开发default SMS app

2、怎么提示用户设置自己的app为default SMS app

3、对短信备份恢复类App的一点建议

怎么开发default SMS app

现存的短信类App不会默认升级为default SMS app,需要完成Android新的规范协议。Android 4.4中,系统收到短信时,只有一个应用能收到SMS_DELIVER_ACTION,这个应用就是default SMS app,WAP_PUSH_DELIVER_ACTION也是类似。如果现存的短信类App不做改造,运行在Android 4.4也不会Crash,但是写入短信数据库数据时会失败。

为了使你的应用出现在系统设置的Default SMS app中,你需要在manifest 文件声明一下几种能力。

1、接收SMS_DELIVER_ACTION("android.provider.Telephony.SMS_DELIVER")的broadcast receiver,这个broadcast receiver需要有BROADCAST_SMS权限。

这些是为了让你的应用能接收到SMS messages。

2、接收WAP_PUSH_DELIVER_ACTION("android.provider.Telephony.WAP_PUSH_DELIVER") 的broadcast receiver,这个需要BROADCAST_WAP_PUSH权限。

这些是为了让你的应用能接收到MMS messages。

3、实现发送短信功能,需要有个Activity完成ACTION_SENDTO("android.intent.action.SENDTO")intent filter,并使用schemas,sms:,smsto:,mms:, 以及mmsto:。

这可以使其他应用调用你的发短信能力。

 

4、实现一个提供intent filter forACTION_RESPONSE_VIA_MESSAGE("android.intent.action.RESPOND_VIA_MESSAGE") with schemas,sms:,smsto:,mms:, andmmsto服务。这个服务需要SEND_RESPOND_VIA_MESSAGE权限。

这允许用户使用您的应用程序提供即时短信回应电话呼入。

下面是一个manifest文件的例子:

<manifest>...<application><!-- BroadcastReceiver that listens for incoming SMS messages --><receiver android:name=".SmsReceiver"android:permission="android.permission.BROADCAST_SMS"><intent-filter><action android:name="android.provider.Telephony.SMS_DELIVER" /></intent-filter></receiver><!-- BroadcastReceiver that listens for incoming MMS messages --><receiver android:name=".MmsReceiver"android:permission="android.permission.BROADCAST_WAP_PUSH"><intent-filter><action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" /><data android:mimeType="application/vnd.wap.mms-message" /></intent-filter></receiver><!-- Activity that allows the user to send new SMS/MMS messages --><activity android:name=".ComposeSmsActivity" ><intent-filter><action android:name="android.intent.action.SEND" />                <action android:name="android.intent.action.SENDTO" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="sms" /><data android:scheme="smsto" /><data android:scheme="mms" /><data android:scheme="mmsto" /></intent-filter></activity><!-- Service that delivers messages from the phone "quick response" --><service android:name=".HeadlessSmsSendService"android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"android:exported="true" ><intent-filter><action android:name="android.intent.action.RESPOND_VIA_MESSAGE" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="sms" /><data android:scheme="smsto" /><data android:scheme="mms" /><data android:scheme="mmsto" /></intent-filter></service></application>
</manifest>

Android 4.4可以使用SMS_RECEIVED_ACTION广播来观察收到了短信,这样可以知道特定的短信收到了,但是我们不能对接收到短信做处理。

设置自己的app为default SMS app

Android4.4中提供了新的方法Telephony.Sms.getDefaultSmsPackage(),可以获取到当前Default SMS app的包名。用户打开你的应用时可以通过判断知道自己的应用是否为Default SMS app。如果不是,可以通过startActivity()方法启动类似如下的Dialog。具体实现可参考下面的代码。

public class ComposeSmsActivity extends Activity {@Overrideprotected void onResume() {super.onResume();final String myPackageName = getPackageName();if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {// App is not default.// Show the "not currently set as the default SMS app" interfaceView viewGroup = findViewById(R.id.not_default_app);viewGroup.setVisibility(View.VISIBLE);// Set up a button that allows the user to change the default SMS appButton button = (Button) findViewById(R.id.change_default_app);button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {Intent intent =new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName);startActivity(intent);}});} else {// App is the default.// Hide the "not currently set as the default SMS app" interfaceView viewGroup = findViewById(R.id.not_default_app);viewGroup.setVisibility(View.GONE);}}
}

对短信备份恢复类App的一点建议

短信备份恢复类应用没有Default SMS app的能力,不能写入短信数据库数据,就起不到恢复短信的作用了。Android开发者博客给出的建议是临时的设置自己的应用为Default SMS app,临时获取一次写入短信数据库数据能力,等短信恢复完成再改回原来的应用为Default SMS app。

1、获取默认App的包名并保存。

String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);

2、让用户修改你的app为Default SMS app

Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
startActivity(intent);

3、恢复完短信,再让用户修改回Default SMS app,使用第一步保存的包名。

Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp);
startActivity(intent);

上面是一些Android4.4短信变化的介绍,大部分是翻译自Android开发者博客,由于作者英语水平有限,可能与原作者的理解有些出入,敬请读者谅解。

/**
* @author 张兴业

* http://blog.csdn.net/xyz_lmn
* 我的新浪微博:@张兴业TBOW
*/

参考:

http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html

做好准备,让你的短信应用迎接Android 4.4(KitKat)相关推荐

  1. 让你的短信应用迎接Android 4.4(KitKat)

    原文地址:Getting Your SMS Apps Ready for KitKat 发送和接收短信是手机最基本的功能,很多的开发者也开发了很多成功的应用来增强Android这一方面的体验.你们当中 ...

  2. iPhone短信导入到Android手机的方法

    iPhone短信导入到Android手机的方法 自从有了豌豆荚,在Android手机之间导入导出短信就简单了好多.但是,从iPhone导出的短信,还是不能直接导入豌豆荚.以前倒过一次,用的是阿里云的客 ...

  3. 短信拦截转发器----Android

    前提: 我们在操作群控及云控的时候,我们想把验证码发出来,这个时候我们人工去弄得话,极为繁琐. 除了前几年QQ还是很火的时候,使用的猫池接码,现在也消失匿迹了,若有资源可联系我,本人需要几台测试. 这 ...

  4. android短信功能裁剪,Android短信发送功能实现技巧分享

    如现在启动一模拟器id 号为5554,运行cmd telnet localhost 5554 输入help 可以看到很多用于模拟器中的功能命令 gsm call 134343434   // 便是呼叫 ...

  5. android 短信位置,浅析Android手机卫士之手机实现短信指令获取位置

    推荐阅读: 获取位置 新建一个service的包 新建一个GPSService类继承系统的Service类 清单文件中注册一下 重写onCreate()方法,服务创建的时候回调 重写onDestroy ...

  6. WCF 实例 —— Android 短信助手 (WCF + Android)

    (1)最近开始学习 Android,为了更快上手于是给自己找个小课题来练习一下: WCF作为服务端开放RESTful Service,Android作为客户端将手机上的短信传给服务端显示,并轮询服务端 ...

  7. android短信验证码方案,Android之短信验证码

    今天所使用的方案只是android手机设备集成短信验证码功能的方案之一. 我们所采用的方案是使用聚合数据的短信验证sdk. 接口文档:https://www.juhe.cn/docs/api/... ...

  8. android短信显示内容,Android获取手机短信SMS收件箱内容

    Android中读取的短信方式(短信区域),具体有如下几种方式: /** * 所有的短信 */ public static final String SMS_URI_ALL = "conte ...

  9. 短信管理器android,短信夹管理软件-短信夹管理app预约v1.4.3 安卓版-西西软件园...

    短信夹管理app是一款系统工具的应用软件,能有效的帮你管理好各种杂乱的短信,拒绝重复和失效短信,随时短信还款提醒,网上购物短信包裹自动提醒,各种重要信息帮你备份,喜欢用户欢迎下载. 短信夹管理app功 ...

最新文章

  1. TAB(Nav)导航菜单
  2. 没有c语言基础可以学python吗-没有c语言基础,能不能学好python?
  3. ESB与可插拨系统的思考
  4. html 中写样式,css样式中黑体怎么写
  5. python初学代码留个纪念
  6. jira java接口生成问题
  7. 学Python可以用来干什么?就业情况究竟怎么样?
  8. n3k配置vpc是否还需要配置hsrp_HSRP
  9. ORACLE数据库异步IO介绍
  10. VB.net绘制tan函数图像
  11. oracle恢复表的数据到某个时间点
  12. STM32G431简介
  13. 云中漫步-我这一辈子
  14. HtmlParser初步研究
  15. 基于Spring Boot的讲师积分管理系统(毕业设计,毕设)
  16. mysql 联合主键_mysql的联合主键与复合主键区别
  17. 对比解读五种主流大数据架构的数据分析能力
  18. 铜陵市商标注册申请流程以及阶段时间介绍
  19. 【opencv 450 Image Processing】Periodic Noise Removing Filter周期性去噪滤波器
  20. 读到心醉,很美的文字

热门文章

  1. 微服务那么热,创业公司怎么选用实践?
  2. 这不是我想要的Serverless
  3. Ubuntu16.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐)
  4. Git版本恢复命令reset(转载)
  5. Spring Http Invoker使用简介
  6. oracle导出dmp的时候使用owner
  7. 简介如何查看执行计划以及执行计划的准确性
  8. (十七)Activitivi5之组任务分配
  9. linux 命令find
  10. centos下编译lnmp环境