gpt4 book ai didi

android - 停止短信移动到收件箱

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:22 25 4
gpt4 key购买 nike

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

然后在onRecieve()消息中中止tbroadcast()。然而,在android 4.4中,我们需要定义sms_deliver_操作,以便将我们的消息应用程序设为默认:
Getting Your SMS Apps Ready for KitKat
通过这样做,我可以先接收消息,他们不会移动到任何其他消息应用程序,但我也需要将他们发送到消息应用程序,如果它不符合我的条件。那么有没有办法实现这个功能呢?

最佳答案

当android系统接收到sms时,它会使用“android.provider.telephony.sms_received”操作广播一个有序的广播意图。所有注册的接收者,包括系统默认的sms应用程序,按照其意图过滤器中设置的优先级接收此意图。未指定具有相同优先级的广播接收器的顺序。任何广播接收器都可以使用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;
}
}

// ...
}
}

看起来系统默认的短信处理应用程序使用0优先级,因此您可以尝试1使应用程序位于0优先级之前。将这些行添加到
androidmanifest.xml文件:
<receiver android:name=".SmsFilter">
<intent-filter android:priority="1">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>

不要忘记必要的权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>

顺便说一下,您可以使用以下代码查找所有注册的接收器及其优先级:
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);
}

=================================================================
在android kitkat中防止短信进入收件箱
kitkat中引入了一个更改,一次只允许一个应用程序(默认的sms应用程序)对sms db拥有写权限,并且能够使用它。
你有两种解决问题的方法:
按照google的建议,在您需要执行更改时,如何请求用户将默认的sms应用程序切换到您的应用程序(完成后,允许用户切换回原始的默认sms应用程序)。
找一个临时的方法来做你需要做的事。作为提示,有一个隐藏的api:
AppOpsManager为了授予您的应用程序写权限(op_write_sms),您可能会利用此漏洞,请转到此xda页面了解更多信息:
How to write to SMS Content Provider in Android KitKat WITHOUT being default SMS app
如果您有任何疑问请回复…
更新
从android 4.4kitkat开始,如果没有默认的短信应用程序,就不可能执行任何与短信相关的操作。还原和备份应用程序也无法执行此操作。他们中的大多数已经更新了他们的应用程序以支持此功能,现在要求用户选择他们作为默认的短信应用程序。
android kitkat更新不再支持用其他应用程序编写短信。你只能听,不能写。如果要发送短信,则必须将其发送到默认短信意图,用户必须批准并单击“发送”才能发送短信。
供参考: SMS provider

关于android - 停止短信移动到收件箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com