интеграция телефонии

Рейтинг: 1Ответов: 1Опубликовано: 24.05.2023

Как можно автоматически пересылать все sms, которые приходят твоему пользователю в приложение "sms"? Можно ли запрашивать например разрешение на обработку его смс? Как приложения а-ля tinkoff ввели такую фишку: там, где запрашивается код, отправленный на телефон, приложение предлагает автоввод (не выходя из приложения) кода, который пришел в приложение "sms"? Мне нужно примерно подобное решение. Пользователь получает данные от другого пользователя, и эти данные мне нужно обрабатывать, может, с согласием пользователя?

весь инет облазил, не знаю как решить

Ответы

▲ 0

Для обработки входящих сообщений вам нужно добавить разрешения в манифест:

<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