Ответ 1
Когда SMS получен системой Android, он передает упорядоченную передачу 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 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;
}
}
// ...
}
}
Похоже, что приложение для обработки 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>
Не забывайте о необходимых разрешениях:
<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);
}
Обновление: Как сказано в FantasticJamieBurn , начиная с Android 4.4 единственным приложением, которое может перехватывать SMS (и блокировать, если хотите), является приложение SMS по умолчанию (выбрано пользователем). Все остальные приложения могут слушать только входящие SMS, если приложение SMS по умолчанию не заблокировало его.
См. также Поставщик SMS в API Android 4.4.