我正在开发一个商业短信应用程序.在此应用程序中,如果传入的消息来自特定号码,例如999999999,它应该转到应用程序的收件箱而不是默认的本机收件箱.所有其他消息应该转到手机的本机收件箱.我该怎么做呢?
pra*_*oid 31
当Android系统收到SMS时,它会广播 Intent带有动作的有序广播"android.provider.Telephony.SMS_RECEIVED".所有已注册的接收器,包括系统默认的SMS应用程序,Intent都按照priority其中设置的顺序接收intent-filter.未指定具有相同优先级的广播接收者的顺序.任何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)
更新:正如FantasticJamieBurn 所说,从Android 4.4开始,唯一可以拦截短信的应用程序(如果愿意阻止)是默认的短信应用程序(由用户选择).如果默认短信应用未阻止,则所有其他应用只能收听传入的短信.
另请参阅Android 4.4 API中的SMS提供程序.
Fan*_*rns 12
随着Android 4.4 KitKat(API级别19)的发布,已删除阻止SMS消息并阻止其传递到默认SMS应用程序的选项.非默认SMS应用程序可能会在收到SMS消息时观察到这些消息,但Android 4.4+将忽略任何中止广播的尝试.
如果您的现有应用程序依赖于中止SMS消息广播,那么您可能需要考虑当用户升级到Android 4.4+时此行为更改将产生的影响.
http://android-developers.blogspot.co.uk/2013/10/getting-your-sms-apps-ready-for-kitkat.html
| 归档时间: |
|
| 查看次数: |
16742 次 |
| 最近记录: |