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

简介:

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


1)接收短信问题:

  1. Other apps that only want to read new messages can instead receive the  

  2. SMS_RECEIVED_ACTION broadcast intent when a new SMS arrives.  


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


2)发送短信问题:

  1. When your app is not currently selected as the default SMS app, it's important that you  

  2. disable the ability to send new messages from your app because, without the ability to  

  3. 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 文件声明一下几种能力。

20131017150259421

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 for ACTION_RESPONSE_VIA_MESSAGE("android.intent.action.RESPOND_VIA_MESSAGE") with schemas, sms:smsto:mms:, and mmsto服务。这个服务需要SEND_RESPOND_VIA_MESSAGE权限。

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


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

  1. <manifest>

  2.    ...  

  3. <application>

  4. <!-- BroadcastReceiver that listens for incoming SMS messages -->

  5. <receiverandroid:name=".SmsReceiver"

  6. android:permission="android.permission.BROADCAST_SMS">

  7. <intent-filter>

  8. <actionandroid:name="android.provider.Telephony.SMS_DELIVER"/>

  9. </intent-filter>

  10. </receiver>

  11. <!-- BroadcastReceiver that listens for incoming MMS messages -->

  12. <receiverandroid:name=".MmsReceiver"

  13. android:permission="android.permission.BROADCAST_WAP_PUSH">

  14. <intent-filter>

  15. <actionandroid:name="android.provider.Telephony.WAP_PUSH_DELIVER"/>

  16. <dataandroid:mimeType="application/vnd.wap.mms-message"/>

  17. </intent-filter>

  18. </receiver>

  19. <!-- Activity that allows the user to send new SMS/MMS messages -->

  20. <activityandroid:name=".ComposeSmsActivity">

  21. <intent-filter>

  22. <actionandroid:name="android.intent.action.SEND"/>

  23. <actionandroid:name="android.intent.action.SENDTO"/>

  24. <categoryandroid:name="android.intent.category.DEFAULT"/>

  25. <categoryandroid:name="android.intent.category.BROWSABLE"/>

  26. <dataandroid:scheme="sms"/>

  27. <dataandroid:scheme="smsto"/>

  28. <dataandroid:scheme="mms"/>

  29. <dataandroid:scheme="mmsto"/>

  30. </intent-filter>

  31. </activity>

  32. <!-- Service that delivers messages from the phone "quick response" -->

  33. <serviceandroid:name=".HeadlessSmsSendService"

  34. android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"

  35. android:exported="true">

  36. <intent-filter>

  37. <actionandroid:name="android.intent.action.RESPOND_VIA_MESSAGE"/>

  38. <categoryandroid:name="android.intent.category.DEFAULT"/>

  39. <dataandroid:scheme="sms"/>

  40. <dataandroid:scheme="smsto"/>

  41. <dataandroid:scheme="mms"/>

  42. <dataandroid:scheme="mmsto"/>

  43. </intent-filter>

  44. </service>

  45. </application>

  46. </manifest>




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



设置自己的app为default SMS app


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

20131017154225312

  1. publicclass ComposeSmsActivity extends Activity {  

  2. @Override

  3. protectedvoid onResume() {  

  4. super.onResume();  

  5. final String myPackageName = getPackageName();  

  6. if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {  

  7. // App is not default.

  8. // Show the "not currently set as the default SMS app" interface

  9.            View viewGroup = findViewById(R.id.not_default_app);  

  10.            viewGroup.setVisibility(View.VISIBLE);  

  11. // Set up a button that allows the user to change the default SMS app

  12.            Button button = (Button) findViewById(R.id.change_default_app);  

  13.            button.setOnClickListener(new View.OnClickListener() {  

  14. publicvoid onClick(View v) {  

  15.                    Intent intent =  

  16. new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);  

  17.                    intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME,  

  18.                            myPackageName);  

  19.                    startActivity(intent);  

  20.                }  

  21.            });  

  22.        } else {  

  23. // App is the default.

  24. // Hide the "not currently set as the default SMS app" interface

  25.            View viewGroup = findViewById(R.id.not_default_app);  

  26.            viewGroup.setVisibility(View.GONE);  

  27.        }  

  28.    }  

  29. }  





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


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


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

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


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



  1. Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);  

  2. intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());  

  3. startActivity(intent);  


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


  1. Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);  

  2. intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, defaultSmsApp);  

  3. startActivity(intent);  




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

/**
* @author 张兴业
*  iOS入门群:83702688
*  android开发进阶群:241395671
*  我的新浪微博:@张兴业TBOW
*/


参考:

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



     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1344873,如需转载请自行联系原作者





相关文章
|
21天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
21天前
|
存储 搜索推荐 Java
打造个性化安卓应用:从设计到实现
【10月更文挑战第30天】在数字化时代,拥有一个个性化的安卓应用不仅能够提升用户体验,还能加强品牌识别度。本文将引导您了解如何从零开始设计和实现一个安卓应用,涵盖用户界面设计、功能开发和性能优化等关键环节。我们将以一个简单的记事本应用为例,展示如何通过Android Studio工具和Java语言实现基本功能,同时确保应用流畅运行。无论您是初学者还是希望提升现有技能的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧。
|
25天前
|
搜索推荐 开发工具 Android开发
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。
|
26天前
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
38 2
|
30天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
48 5
|
30天前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。
|
1月前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin多线程优化策略
【10月更文挑战第11天】本文探讨了如何在Kotlin中实现高效的多线程方案,特别是在Android应用开发中。通过介绍Kotlin协程的基础知识、异步数据加载的实际案例,以及合理使用不同调度器的方法,帮助开发者提升应用性能和用户体验。
49 4
|
1月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
51 2
|
1月前
|
XML 数据可视化 Android开发
Android应用界面
Android应用界面中的布局和控件使用,包括相对布局、线性布局、表格布局、帧布局、扁平化布局等,以及AdapterView及其子类如ListView的使用方法和Adapter接口的应用。
25 0
Android应用界面
|
1月前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
21 0
下一篇
无影云桌面