Чтение SMS из папки «Входящие» в развертывании Unity для Android и iOS

Мне нужно реализовать небольшой текстовый пользовательский интерфейс для отображения сообщений OTP MSM из папки «Входящие» в Unity.

Кто-нибудь знает, как проверять или отправлять SMS-сообщения в Unity, не открывая приложение SMS по умолчанию?

Я нашел ссылку ниже для отправки сообщения без запуска приложения SMS по умолчанию. Я хочу прочитать SMS-сообщение, чтобы автоматически заполнить OTP для процесса регистрации. Возможно ли это с Unity?

https://gist.github.com/rmdwirizki/87f9e68c7ef6ef809a777eb25f12c3b2

проверка или чтение смс из папки "Входящие" в единстве

https://gist.github.com/taesiri/7431660


person keerthikaitmit    schedule 06.12.2018    source источник
comment
Я считаю, что на платформе Android это можно сделать, написав собственный плагин на Java. Создание и использование подключаемых модулей для Android Я хочу создать простой демонстрационный проект, чтобы покажи как это сделать. Но это может занять некоторое время.   -  person ming060    schedule 06.12.2018
comment
В iOS вы не можете читать сообщения пользователя. Это было бы нарушением конфиденциальности. В iOS 12, если вы установите тип текстового поля для пароля, iOS предложит входящий OTP в качестве параметра автозаполнения, если он будет обнаружен.   -  person Paulw11    schedule 07.12.2018
comment
Спасибо @ming060. Я постараюсь разработать с помощью Building и плагинов для Android, и я дам вам знать, если позволит время, покажите мне какой-нибудь образец или руководство.   -  person keerthikaitmit    schedule 07.12.2018


Ответы (1)


На платформе Android:

Демонстрационный проект здесь

  1. Создайте подключаемые модули AAR и библиотеки Android. (Вы можете выбрать jar или aar для реализации плагина, единственное отличие состоит в том, что плагин aar содержит ресурсы Android. В этом случае нам нужно добавить разрешение в AndroidManifest.xml, который можно поместить внутрь aar и позже автоматически объединить Unity. )

    Следуйте этой инструкции Создайте библиотеку Android.

    В плагине aar реализуйте BroadcastReceiver, который обрабатывает намерение получения SMS.

    SmsListener.java

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.telephony.SmsMessage;
    
    import com.unity3d.player.UnityPlayer;
    
    public class SmsListener extends BroadcastReceiver {
        private final String UnityCallbackObject = "UnitySMSReceiver";
        private final String UnityCallbackMethod = "OnSMSReceive";
    
        @Override
        public void onReceive(Context context, Intent intent) {
            StringBuilder builder = new StringBuilder();
    
            Object[] objects = (Object[]) intent.getExtras().get("pdus");
            SmsMessage message = null;
            for (int i = 0; i < objects.length; i++) {
                message = SmsMessage.createFromPdu((byte[]) objects[i]);
                builder.append(message.getDisplayMessageBody());
            }
            UnityPlayer.UnitySendMessage(UnityCallbackObject, UnityCallbackMethod, builder.toString());
        }
    }
    

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="your.package.name.here">
    
        <uses-permission android:name="android.permission.RECEIVE_SMS" />
        <uses-permission android:name="android.permission.READ_SMS" />
    
        <application>
            <receiver android:name="your.package.name.here.SmsListener" android:enabled="true">
                <intent-filter>
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                </intent-filter>
            </receiver>
        </application>
    </manifest>
    
  2. На стороне Unity поместите сгенерированный файл aar в Assets/Plugins/Android. Создайте игровой объект с именем UnitySMSReceiver и прикрепите к сцене функцию реализации скрипта OnSMSReceive.

    public void OnSMSReceive (string message) {
        // do something with your SMS message here.
    }
    

    Мои среды:

    Unity 2017.2.0f3
    
    Android Studio 3.2.1
    

Использованная литература:

Android тестирует sms из эмулятора

Android — прослушивание входящих SMS-сообщений

Как программно читать SMS-сообщения в Android

Android: программный прием SMS-сообщений

Приемник SMS для Android не работает

Unity3D и проблема с aar

https://blog.gradle.org/introduction-compile-only-dependencies

person ming060    schedule 07.12.2018
comment
Большое спасибо @ ming060, все отлично работает. Я попытался создать новый проект на основе вашей инструкции, он работает хорошо. Спасибо. - person keerthikaitmit; 10.12.2018
comment
Но у меня есть одно сомнение, он получает весь контент смс. Как я могу ограничить получение SMS от конкретного отправителя. Я контролировал контент и получил номер одноразового пароля один на стороне единства. - person keerthikaitmit; 10.12.2018
comment
Как теперь передать содержимое сообщения со стороны Android на сторону Unity? - person ming060; 10.12.2018
comment
Я не передаю сообщение с Android на Unity. Именно мне нужно, когда пользователь регистрирует приложение с электронной почтой и номером мобильного телефона. Мы пытаемся подтвердить номер мобильного телефона, используя метод OTP. По сути, здесь мы отправляем сообщение на номер проблемы через портал массовых смс из бэкэнда. Я отключил строку в зависимости от моей потребности. и попробуй отобразить. Вот что я спрашиваю, можем ли мы прочитать смс конкретного отправителя. - person keerthikaitmit; 10.12.2018
comment
Итак, вы используете плагин Android для получения всех SMS-сообщений на телефоне? - person ming060; 10.12.2018
comment
Да, но не все сообщения. Например: код подтверждения вашей учетной записи Mi — 068887. Срок действия этого OTP истекает через 1 дня. Из этого смс мне нужно прочитать этот одноразовый пароль для автозаполнения. Нужно читать смс от конкретных получателей. - person keerthikaitmit; 10.12.2018
comment
Вы хотите получить только код 068887 из сообщения? - person ming060; 10.12.2018
comment
Да, @ ming060, абсолютно. - person keerthikaitmit; 10.12.2018
comment
Если ваше SMS-сообщение OTP соответствует определенному шаблону, используйте Regular expression для фильтрации кода OTP. Это первый способ, о котором я думаю. - person ming060; 10.12.2018
comment
Конечно попробую так. Но моя забота состоит в том, чтобы получить сообщение от конкретного отправителя, а не все сообщения. Обычно мы также получаем OTP msg с банковских сайтов или другим методом входа или забывания pwd. - person keerthikaitmit; 10.12.2018
comment
В моем демонстрационном проекте выше я могу получить отправителя SMS-сообщения. Я не знаю, можете ли вы получить эту информацию из своего плагина. - person ming060; 10.12.2018
comment
Я проверю @ming060. - person keerthikaitmit; 11.12.2018
comment
@keerthikaitmit Удалось ли вам получить сообщение от конкретного отправителя? Если да, то не могли бы вы помочь мне с тем же? - person Sathish; 27.06.2019
comment
это все еще работает? не могу найти как заставить его получать смс - person Skin_phil; 08.10.2020
comment
Привет @Skin_phil, только что решил проблему. И, пожалуйста, не забудьте предоставить разрешение на SMS вручную. - person ming060; 22.10.2020
comment
Спасибо, да, проблема была в получении прав, после этого проблем не было. - person Skin_phil; 22.10.2020