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


相关文章
|
2天前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
20 10
|
3天前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
27 2
|
1天前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
2天前
|
人工智能 缓存 数据库
安卓应用开发中的性能优化技巧AI在医疗诊断中的应用
【8月更文挑战第29天】在安卓开发的广阔天地里,性能优化是提升用户体验、确保应用流畅运行的关键所在。本文将深入浅出地探讨如何通过代码优化、资源管理和异步处理等技术手段,有效提升安卓应用的性能表现。无论你是初学者还是资深开发者,这些实用的技巧都将为你的安卓开发之路增添光彩。
|
2天前
|
搜索推荐 开发工具 Android开发
打造个性化安卓应用:从零开始的Flutter之旅
【8月更文挑战第29天】在这个数字时代,个性化的应用成为了展示自我风格的一种方式。本文将引导你通过Flutter框架,一步步构建属于你的首个安卓应用。我们将探索Flutter的核心概念,界面设计,以及如何将你的创意转化为现实。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。让我们一起踏上这段创造性的旅程吧!
|
9天前
|
存储 安全 物联网
Android经典实战之跳转到系统设置页面或其他系统应用页面大全
本文首发于公众号“AntDream”,关注获取更多技巧。文章总结了Android开发中跳转至系统设置页面的方法,包括设备信息、Wi-Fi、显示与声音设置等,并涉及应用详情与电池优化页面。通过简单的Intent动作即可实现,需注意权限与版本兼容性。每日进步,尽在“AntDream”。
39 2
|
13天前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
25 1
|
1天前
|
JSON 缓存 搜索推荐
探索安卓开发:打造个性化天气应用探索移动应用开发之旅:从基础到高级
【8月更文挑战第30天】在数字化时代,智能手机已成为我们日常生活中不可或缺的一部分。安卓系统以其开放性和灵活性赢得了全球用户的青睐。本文将引导你了解如何利用安卓开发技术,从零开始构建一个具有个性化特色的天气应用。我们将一起深入探讨应用的设计思路、核心功能实现以及用户交互体验的优化方法。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
1天前
|
物联网 区块链 vr&ar
未来已来:探索区块链、物联网与虚拟现实技术的融合与应用安卓与iOS开发中的跨平台框架选择
【8月更文挑战第30天】在科技的巨轮下,新技术不断涌现,引领着社会进步。本文将聚焦于当前最前沿的技术——区块链、物联网和虚拟现实,探讨它们各自的发展趋势及其在未来可能的应用场景。我们将从这些技术的基本定义出发,逐步深入到它们的相互作用和集成应用,最后展望它们如何共同塑造一个全新的数字生态系统。
|
5天前
|
缓存 监控 Android开发
构建高效的Android应用:从内存优化到用户体验
【7月更文挑战第57天】 在竞争激烈的移动市场中,一个高效、流畅且具有优秀用户体验的Android应用是成功的关键。本文将深入探讨如何通过内存管理和界面优化来提升应用性能,包括实用的编程技巧和策略,以及如何利用Android系统提供的工具进行调试和性能监控。读者将学习到如何识别和解决常见的性能瓶颈,以及如何设计出既美观又实用的用户界面。