Я только недавно внедрил работающий BroadcastReceiver для обработки SMS-сообщений.Ключевыми частями являются манифест и BroadcastReceiver.
В манифесте вам необходимо разрешение RECEIVE_SMS:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
Вам не нужен READ_SMS.Запись вашего приемника должна выглядеть примерно так:
<receiver
android:name=".IncomingSmsBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
Бит, который большинство людей, кажется, забывают, это android:exported="true"
, который необходим, потому что широковещательная передача происходит из-за пределов вашего приложения.Некоторые публикации предполагают, что вам нужно android:permission="android.permission.RECEIVE_SMS"
или android:permission="android.permission.BROADCAST_SMS"
, но это не так.
Моя реализация BroadcastReceiver выглядит так:
package smsmanager;
import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class IncomingSmsBroadcastReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(final Context context, final Intent intent) {
if (intent != null && SMS_RECEIVED.equals(intent.getAction())) {
final SmsMessage smsMessage = extractSmsMessage(intent);
processMessage(context, smsMessage);
}
}
private SmsMessage extractSmsMessage(final Intent intent) {
final Bundle pudsBundle = intent.getExtras();
final Object[] pdus = (Object[]) pudsBundle.get("pdus");
final SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]);
return smsMessage;
}
private void processMessage(final Context context, final SmsMessage smsMessage) {
// Do something interesting here
}
}
И все работает так, как я хочуи я могу прекратить прожигать свои SMS-надписи, проверяя ths