做好准备,让你的短信应用迎接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,如需转载请自行联系原作者





相关文章
|
12天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
13天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
14天前
|
开发框架 安全 Android开发
探索安卓系统的新趋势:智能家居应用的蓬勃发展
随着智能家居概念的兴起,安卓系统在智能家居应用领域的应用日益广泛。本文将探讨安卓系统在智能家居应用开发方面的最新趋势和创新,以及其对用户生活的影响。
12 2
|
17天前
|
缓存 监控 Java
构建高效Android应用:从优化用户体验到提升性能
在竞争激烈的移动应用市场中,为用户提供流畅和高效的体验是至关重要的。本文深入探讨了如何通过多种技术手段来优化Android应用的性能,包括UI响应性、内存管理和多线程处理。同时,我们还将讨论如何利用最新的Android框架和工具来诊断和解决性能瓶颈。通过实例分析和最佳实践,读者将能够理解并实施必要的优化策略,以确保他们的应用在保持响应迅速的同时,还能够有效地利用系统资源。
|
17天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
14天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
1天前
|
搜索推荐 开发工具 Android开发
安卓即时应用(Instant Apps)开发指南
【4月更文挑战第14天】Android Instant Apps让用户体验部分应用功能而无需完整下载。开发者需将应用拆分成模块,基于已上线的基础应用构建。使用Android Studio的Instant Apps Feature Library定义模块特性,优化代码与资源以减小模块大小,同步管理即时应用和基础应用的版本。经过测试,可发布至Google Play Console,提升用户便利性,创造新获客机会。
|
2天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
2天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
8天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。