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以使我们的消息传递应用程序成为默认值:
通过这样做,我可以首先接收消息,他们不会移动到任何其他消息应用程序,但如果它不符合我的标准,我还需要将它们发送到消息传递应用程序.那么有什么方法可以实现这个功能吗?
小智 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具有写入权限并能够使用它.
您有两种方法可以解决您的问题:
如何在Android KitKat中写入SMS Content Provider而不是默认的SMS应用程序
如果您有任何疑问,请回复...
UPDATE
从Android 4.4 Kitkat开始,如果不是默认的SMS应用程序,则无法执行任何类型的SMS相关操作.还原和备份应用程序也无法执行此操作.他们中的大多数已经更新了他们的应用程序以支持此功能,现在要求用户选择它们作为默认的SMS应用程序.
Android KitKat更新已停止支持与其他应用程序一起编写SMS.你只能听,但不能写.如果要发送短信,则必须将其发送到默认短信意图,用户必须先批准并在发送短信之前单击"发送".
对于您的ref:SMS提供商
| 归档时间: |
|
| 查看次数: |
4713 次 |
| 最近记录: |