Для обработки входящих сообщений вам нужно добавить разрешения в манифест:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
дальше как вы правильно заметили нужно запрашивать разрешения на чтение смс:
public boolean isSmsPermissionGranted() {
return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED;
}
/**
* Request runtime SMS permission
*/
private void requestReadAndSendSmsPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_SMS)) {
// You may display a non-blocking explanation here, read more in the documentation:
// https://developer.android.com/training/permissions/requesting.html
}
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, SMS_PERMISSION_CODE);
}
и вот например слушатель входящих сообщений:
public class SmsBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "SmsBroadcastReceiver";
private final String serviceProviderNumber;
private final String serviceProviderSmsCondition;
private Listener listener;
public SmsBroadcastReceiver(String serviceProviderNumber, String serviceProviderSmsCondition) {
this.serviceProviderNumber = serviceProviderNumber;
this.serviceProviderSmsCondition = serviceProviderSmsCondition;
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
String smsSender = "";
String smsBody = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) {
smsSender = smsMessage.getDisplayOriginatingAddress();
smsBody += smsMessage.getMessageBody();
}
} else {
Bundle smsBundle = intent.getExtras();
if (smsBundle != null) {
Object[] pdus = (Object[]) smsBundle.get("pdus");
if (pdus == null) {
// Display some error to the user
Log.e(TAG, "SmsBundle had no pdus key");
return;
}
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
smsBody += messages[i].getMessageBody();
}
smsSender = messages[0].getOriginatingAddress();
}
}
if (smsSender.equals(serviceProviderNumber) && smsBody.startsWith(serviceProviderSmsCondition)) {
if (listener != null) {
listener.onTextReceived(smsBody);
}
}
}
}
void setListener(Listener listener) {
this.listener = listener;
}
interface Listener {
void onTextReceived(String text);
}
}
нам его нужно так же зарегистрировать в манифесте:
<receiver android:name="SmsBroadcastReceiver" />
Дальше объявляете его в активности например:
private SmsBroadcastReceiver smsBroadcastReceiver;
...
smsBroadcastReceiver = new SmsBroadcastReceiver(BuildConfig.SERVICE_NUMBER, BuildConfig.SERVICE_CONDITION);
registerReceiver(smsBroadcastReceiver, new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION));
и обрабатываете входящие сообщения:
smsBroadcastReceiver.setListener(new SmsBroadcastReceiver.Listener( {
@Override
public void onTextReceived(String text) {
// Do stuff with received text!
}
});
Вот первоисточник-статья плюс туториал_1 и туториал_2