停止短信移动到收件箱

Uma*_*bal 5 sms android broadcastreceiver android-4.4-kitkat

在Android 4.4之前,我可以通过设置优先级来阻止邮件进入收件箱

    <receiver android:name="com.serviceschedular.helperClasses.SmsReceiver" >
        <intent-filter android:priority="1000">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />          
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

然后在onRecieve()消息中abortBroadcast().但是在Android 4.4中我们需要定义SMS_DELIVER_ACTION以使我们的消息传递应用程序成为默认值:

让您的SMS应用程序为KitKat做好准备

通过这样做,我可以首先接收消息,他们不会移动到任何其他消息应用程序,但如果它不符合我的标准,我还需要将它们发送到消息传递应用程序.那么有什么方法可以实现这个功能吗?

小智 7

当Android系统收到SMS时,它会通过动作"android.provider.Telephony.SMS_RECEIVED"广播一个有序的广播Intent.所有已注册的接收器(包括系统默认SMS应用程序)都按照其intent-filter中设置的优先级顺序接收此Intent.未指定具有相同优先级的广播接收者的顺序.任何BroadcastReceiver都可以阻止任何其他已注册的广播接收器使用abortBroadcast()接收广播.

所以,你需要的是广播接收器,如下所示:

public class SmsFilter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                Object[] pdus = (Object[])extras.get("pdus");

                if (pdus.length < 1) return; // Invalid SMS. Not sure that it's possible.

                StringBuilder sb = new StringBuilder();
                String sender = null;
                for (int i = 0; i < pdus.length; i++) {
                    SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    if (sender == null) sender = message.getOriginatingAddress();
                    String text = message.getMessageBody();
                    if (text != null) sb.append(text);
                }
                if (sender != null && sender.equals("999999999")) {
                    // Process our sms...
                    abortBroadcast();
                }
                return;
            }
        }

        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来系统默认的SMS处理应用程序使用优先级0,因此您可以尝试使用1作为应用程序.将这些行添加到您的

AndroidManifest.xml中:

<receiver android:name=".SmsFilter">
    <intent-filter android:priority="1">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

不要忘记必要的权限:

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
Run Code Online (Sandbox Code Playgroud)

顺便说一下,您可以使用以下代码找到所有已注册的接收器及其优先级:

Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
List<ResolveInfo> infos = context.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
for (ResolveInfo info : infos) {
    System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
      }
Run Code Online (Sandbox Code Playgroud)

================================================== ===============

用于防止SMS进入Android Kitkat的收件箱

KitKat中引入了一项更改,它一次只允许一个应用程序(默认的SMS应用程序)对SMS DB具有写入权限并能够使用它.

您有两种方法可以解决您的问题:

  • 在您需要执行更改期间,请按照Google的建议,了解如何请求用户将默认SMS应用程序切换到您的应用程序(一旦您完成此操作,允许用户切换回原始默认SMS应用程序).
  • 找一个临时的hacky方式来做你需要做的事情.作为提示,有一个隐藏的API: 您可能会利用的AppOpsManager为您的应用程序提供写入权限(OP_WRITE_SMS),请访问此XDA页面以了解有关它的更多信息:

如何在Android KitKat中写入SMS Content Provider而不是默认的SMS应用程序

如果您有任何疑问,请回复...

UPDATE

从Android 4.4 Kitkat开始,如果不是默认的SMS应用程序,则无法执行任何类型的SMS相关操作.还原和备份应用程序也无法执行此操作.他们中的大多数已经更新了他们的应用程序以支持此功能,现在要求用户选择它们作为默认的SMS应用程序.

Android KitKat更新已停止支持与其他应用程序一起编写SMS.你只能听,但不能写.如果要发送短信,则必须将其发送到默认短信意图,用户必须先批准并在发送短信之前单击"发送".

对于您的ref:SMS提供商