android 4.4 + 默认短信概念

来源:互联网 发布:linux打开绝对路径 编辑:程序博客网 时间:2024/05/20 17:26

前言

虽然很久远的更新,最近用到读写短信,还是踩了一下坑。

发送和接收短信是移动设备的基本功能,为了增强Android的体验,
有些人使用隐藏的API构建了SMS应用程序 - 这是我们不鼓励的做法,
因为这可能会更改或删除隐藏的API,并且为了兼容性不会对新设备进行测试因此,
为您提供完整支持的一组API,用于构建SMS应用程序,并使消息传递的用户体验更加可预测,
Android 4.4(KitKat)使得现有的api公开并添加一个默认的短信应用的概念,
在系统中方便设置,用户可以自由选择默认sms 短信应用程序。

这意味着,如果您使用的是隐藏短信上平台api版本中,您需要做一些调整。
使您的应用程序成为默认的短信应用程序

在Android 4.4上,只有一个应用可以收到新的SMS_DELIVER_ACTION意图 当新的SMS消息到达时系统广播,
哪个应用程式收到此广播是由用户在系统设置中选择为默认短信应用程序的应用程序决定的。同样,
当新的MMS到达时,只有默认的短信应用收到新的WAP_PUSH_DELIVER_ACTION意图,并且可以对短信进行写入运营商数据库(短信数据库中)

这里写图片描述

为了让您的应用在系统设置中显示为合格的默认短信应用,您的清单文件必须声明某些特定功能。所以你必须更新你的应用程序来做以下事情:

1.在广播接收机中,包括一个意图过滤器,广播接收机还必须要求BROADCAST_SMS许可。

SMS_DELIVER_ACTION ( "android.provider.Telephony.SMS_DELIVER" )

2 在广播接收机中,包括一个意图过滤器,广播接收机还必须要求 BROADCAST_WAP_PUSH 权限。

WAP_PUSH_DELIVER_ACTION ( "android.provider.Telephony.WAP_PUSH_DELIVER" ) with the MIME type "application/vnd.wap.mms-message" . 
  1. 在 App中activity传递新的消息需要添加过滤器,他允许您的应用程序接收来自其他希望传递消息的应用程序的意图。
 ACTION_SENDTO ( "android.intent.action.SENDTO" ) with schemas, sms: , smsto: , mms: , and mmsto: .

4 .在服务中,包括一个意图过滤器,此服务还必须要求SEND_RESPOND_VIA_MESSAGE权限

 ACTION_RESPONSE_VIA_MESSAGE ( "android.intent.action.RESPOND_VIA_MESSAGE" ) with schemas, sms: , smsto: , mms: , and mmsto: .

这允许用户使用您的应用程序使用即时短信来响应来电。

在清单文件中记性注册

 <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>

现有应用中SMS_RECEIVED_ACTION广播的任何过滤器将在Android 4.4上继续运行,
但仅作为新消息的观察者,因为除非您的应用程序还收到SMS_DELIVER_ACTION广播,否则您无法在Android 4.4上写入SMS提供商。

从Android 4.4开始,您应该停止收听SMS_RECEIVED_ACTION广播,您可以通过检查平台版本,然后禁用广播接收器在运行时执行此操作

SMS_RECEIVED_ACTION with PackageManager.setComponentEnabledSetting() . 

如果您在Android 4.4上处理SMS_RECEIVED_ACTION意图,请勿取消广播,因为其他应用可能还需要接收广播。

区分两个SMS广播意图,

假设SMS_RECEIVED_ACTION简单地说“系统接收到短信”,
而SMS_DELIVER_ACTION则表示“系统正在递送您的应用程序,因为您是默认的短信应用程序。”

设置自己的app为default SMS app

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

这里写图片描述

sample:

public class ComposeSmsActivity extends Activity {      @Override      protected 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" interface              View viewGroup = findViewById(R.id.not_default_app);              viewGroup.setVisibility(View.VISIBLE);              // Set up a button that allows the user to change the default SMS app              Button 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" interface              View viewGroup = findViewById(R.id.not_default_app);              viewGroup.setVisibility(View.GONE);          }      }  } 

有关SMS备份和还原应用程序的建议

如果是三方对Sms 进行备份还原,官方给出解决方案是临时申请权限,操作完成恢复默认Sms应用。

  1. 查询当前的默认SMS应用程序的包名称并保存。

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

2.请求用户将默认的短信应用更改为您的应用程序,以恢复短信(您必须是默认的短信应用才能写入短信提供商)。

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

3.完成恢复所有SMS消息后,请求用户将默认的SMS应用程序更改回以前选择的应用程序(在步骤1中保存)。

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

如上就是android 4.4 kitkat 默认短信应用概念,如果想做一个恶搞短信app,默认短信设置是避不了的坑。

原创粉丝点击