博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
做好准备,让你的短信应用迎接Android 4.4(KitKat)
阅读量:5771 次
发布时间:2019-06-18

本文共 5580 字,大约阅读时间需要 18 分钟。

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

1)接收短信问题:

[html]
  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)发送短信问题:

[html]
  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完成("android.intent.action.SENDTO")intent filter,并使用schemas, sms:smsto:mms:, 以及 mmsto:。

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

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

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

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

[html]
  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。如果不是,可以通过方法启动类似如下的Dialog。具体实现可参考下面的代码。

20131017154225312

[java]
  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的包名并保存。

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


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

[java]
  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,使用第一步保存的包名。

[java]
  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
*  我的新浪微博:
*/


参考:


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

你可能感兴趣的文章
Centos7同时运行多个Tomcat
查看>>
使用CocoaPods过程中的几个问题
查看>>
Spring boot 整合CXF webservice 全部被拦截的问题
查看>>
Pinpoint跨节点统计失败
查看>>
机房带宽暴涨问题分析及解决方法
查看>>
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
[转载] 中华典故故事(孙刚)——19 万岁
查看>>
php5编译安装常见错误和解决办法集锦
查看>>
Unable to determine local host from URL REPOSITORY_URL=http://
查看>>
ORACLE配置,修改tnsnames.ora文件实例
查看>>
Workstation服务无法启动导致无法访问文件服务器
查看>>
Linux常用命令(一)
查看>>
一个自动布署.net网站的bat批处理实例
查看>>
我的友情链接
查看>>
Centos6.6安装选包及基础场景说明
查看>>
java基础面试题-1
查看>>
lamp+nginx代理+discuz+wordpress+phpmyadmin搭建一
查看>>
windows server 2016 活动目录(二)
查看>>
openstack G版 修改vm的flavor级别
查看>>