Автоматическое чтение OTP на Android

Я работаю над приложением для Android, в котором сервер отправляет OTP, и пользователю необходимо ввести этот OTP в приложении, чтобы зарегистрироваться для моего приложения. Я хочу, чтобы мое приложение могло автоматически читать OTP, отправленный сервер. .Я пытаюсь реализовать автоматическое определение OTP для редактирования текста при получении OTP, я пытался, но ничего не происходит, пожалуйста, помогите мне найти ошибку

Readsms.класс

public class ReadSms extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent)
    {

        final Bundle bundle = intent.getExtras();
        try {

            if (bundle != null)
            {

                final Object[] pdusObj = (Object[]) bundle.get("pdus");
                for (int i = 0; i < pdusObj.length; i++)
                {

                    SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                    String phoneNumber = currentMessage.getDisplayOriginatingAddress();
                    String senderNum = phoneNumber ;
                    String message = currentMessage .getDisplayMessageBody();

                    try
                    {

                        if (senderNum.equals("AZ-PSDSSL"))
                        {

                         Otp Sms = new Otp();
                            Sms.recivedSms(message );
                        }
                    } catch(Exception e){}
                }
            }

        } catch (Exception e) {}
    }

}

Отп.класс

class Otp extends Activity {


    TextView otp;
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_otp);
         otp=findViewById(R.id.otpid);

    }
    public void recivedSms(String message)
    {
        try
        {
            otp.setText(message);
            Toast.makeText(getApplicationContext(),message,Toast.LENGTH_SHORT).show();


        }
        catch (Exception e)
        {
        }
    }
}

OTPActivity.java

if (checkAndRequestPermissions()) {
            // carry on the normal flow, as the case of  permissions  granted.
        }
 private  boolean checkAndRequestPermissions() {
        int permissionSendMessage = ContextCompat.checkSelfPermission(this,
                Manifest.permission.SEND_SMS);

        int receiveSMS = ContextCompat.checkSelfPermission(this,
                Manifest.permission.RECEIVE_SMS);

        int readSMS = ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_SMS);
        List<String> listPermissionsNeeded = new ArrayList<>();

        if (receiveSMS != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.RECEIVE_MMS);
        }
        if (readSMS != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.READ_SMS);
        }
        if (permissionSendMessage != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.SEND_SMS);
        }
        if (!listPermissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions(this,
                    listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),
                    REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    }

Манифест

<uses-permission android:name="android.permission.INTERNET" />

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
     <receiver android:name=".ReadSms" >
                <intent-filter android:priority="999" >
                    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                </intent-filter>
            </receiver>

person Community    schedule 20.03.2018    source источник
comment
это дает какую-либо ошибку в logcat?   -  person Lucifer    schedule 20.03.2018
comment
ошибка не отображается в logcat   -  person    schedule 20.03.2018
comment
Otp Sms = new Otp(); здесь вы создаете новый объект своей деятельности, поэтому он не работает должным образом. Что вам нужно сделать, так это реализовать интерфейс для достижения того, чего вы хотите.   -  person Lucifer    schedule 20.03.2018
comment
как это дублируется братан? Люцифер.. если вы можете ответить на этот вопрос, используя этот ответ   -  person    schedule 20.03.2018
comment
ваш вопрос дублирует этот связанный вопрос, однако ваша настоящая проблема заключается в том, как отправлять данные из широковещательного приемника в текст редактирования вашей деятельности.   -  person Lucifer    schedule 20.03.2018
comment
хм, qstn может быть таким же, но код метода и т. д. dff   -  person    schedule 20.03.2018


Ответы (1)


Пожалуйста, используйте этот код Создать считыватель SMS Приемник вещания

public class IncomingSms extends BroadcastReceiver {

// Get the object of SmsManager
final SmsManager sms = SmsManager.getDefault();

public void onReceive(Context context, Intent intent) {

    // Retrieves a map of extended data from the intent.
    final Bundle bundle = intent.getExtras();

    try {

        if (bundle != null) {

            final Object[] pdusObj = (Object[]) bundle.get("pdus");

            for (int i = 0; i < pdusObj.length; i++) {

                SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                String phoneNumber = currentMessage.getDisplayOriginatingAddress();

                String senderNum = phoneNumber;
                String message = currentMessage.getDisplayMessageBody().replaceAll("\\D", "");

                //message = message.substring(0, message.length()-1);
                Log.i("SmsReceiver", "senderNum: " + senderNum + "; message: " + message);

                Intent myIntent = new Intent("otp");
                myIntent.putExtra("message", message);
                myIntent.putExtra("number", senderNum);
                LocalBroadcastManager.getInstance(context).sendBroadcast(myIntent);
                // Show Alert

            } // end for loop
        } // bundle is null

    } catch (Exception e) {
        Log.e("SmsReceiver", "Exception smsReceiver" + e);

    }
}
}

Объявить класс в манифесте

 <receiver android:name=".receiver.IncomingSms">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

Разрешение в манифесте

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />

Активность, в которой вы хотите получить SMS.

@Override
public void onResume() {
    LocalBroadcastManager.getInstance(this).registerReceiver(receiver, new IntentFilter("otp"));
    super.onResume();
}
@Override
public void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equalsIgnoreCase("otp")) {
            final String message = intent.getStringExtra("message");
            // message is the fetching OTP
        }
    }
};
person Saurabh Vadhva    schedule 20.03.2018
comment
где я добавил номер отправителя? - person ; 20.03.2018
comment
Я уже получил номер отправителя с помощью этого кода myIntent.putExtra(number, senderNum); в классе получателя. Если вы хотите использовать этот номер отправителя, вы можете получить этот номер, используя этот последний String sendernumber = намерение.getStringExtra(number); в методе приемника. - person Saurabh Vadhva; 20.03.2018
comment
я пытался, но не работает.. AZ-PSDSSL я хочу это как имя отправителя.. - person ; 20.03.2018
comment
Итак, вы не можете получить otp .... верно? - person Saurabh Vadhva; 20.03.2018
comment
не могли бы вы поделиться сообщением OTP там? - person Saurabh Vadhva; 20.03.2018
comment
Ваш OTP 06269 - person ; 20.03.2018
comment
на моей стороне работает нормально. - person Saurabh Vadhva; 20.03.2018
comment
Log.i(SmsReceiver, senderNum: + senderNum + ; сообщение: + сообщение); я не могу найти их в logcat, так что это не выполняется ... почему? - person ; 20.03.2018
comment
вы включили разрешение? - person Saurabh Vadhva; 20.03.2018
comment
‹uses-permission android:name=android.permission.INTERNET /› ‹uses-permission android:name=android.permission.ACCESS_NETWORK_STATE /› ‹uses-permission android:name=android.permission.RECEIVE_SMS /› ‹uses-permission android :name=android.permission.READ_SMS /› ‹использует-разрешение android:name=android.permission.READ_PHONE_STATE/› - person ; 20.03.2018
comment
эти prmssn есть, почему класс не выполняется .. я не указал номер отправителя как AZ-PSDSSL .. вы думаете, что это prb? - person ; 20.03.2018
comment
если версия вашего телефона выше 22, вам необходимо разрешить выполнение во время выполнения. - person Saurabh Vadhva; 20.03.2018
comment
да, это орео - person ; 20.03.2018
comment
затем разрешите разрешение времени выполнения. или также может разрешить разрешение для определенного приложения в настройках ... пожалуйста, разрешите это. - person Saurabh Vadhva; 20.03.2018
comment
я разрешил во время выполнения. я думаю, что класс не выполняется - person ; 20.03.2018
comment
но как это возможно.потому что всегда будет работать ваш телефон получил новую смс. - person Saurabh Vadhva; 20.03.2018
comment
да, тогда почему он не просыпается.. даже logcat ничего не показывает.. Log.i(SmsReceiver, senderNum: + senderNum +; message: + message); - person ; 20.03.2018
comment
пожалуйста, удалите приложение, а затем снова установите приложение ... может быть, оно работает. - person Saurabh Vadhva; 20.03.2018
comment
я дублирую сначала exexting здесь private BroadcastReceiver Receiver = new BroadcastReceiver() {...} //receiver=null - person ; 20.03.2018
comment
почему вы добавляете приемник android:name=.receiver.IncomingSms› в манифесте имя класса IncomingSms - person ; 20.03.2018
comment
как узнать, что он возвращает ноль? - person Saurabh Vadhva; 20.03.2018
comment
.receiver.IncomingSms Это имя пакета, в котором вы создаете Receiver. - person Saurabh Vadhva; 20.03.2018
comment
Он определяет, когда ваше приложение получает какие-либо смс, тогда этот вызов широковещательного приемника - person Saurabh Vadhva; 20.03.2018
comment
значение режима отладки может отображаться слева, - person ; 20.03.2018
comment
это работает.? - person Saurabh Vadhva; 20.03.2018
comment
я создаю новый класс с именем IncomingSms, ‹receiver android:name=.IncomingSms› ‹intent-filter› ‹action android:name=android.provider.Telephony.SMS_RECEIVED /› ‹/intent-filter› ‹/receiver› - person ; 20.03.2018
comment
нет, класс IncomingSms не вызывается - person ; 20.03.2018
comment
До сих пор не звонит??? - person Saurabh Vadhva; 20.03.2018
comment
ВходящиеSms не звонят - person ; 20.03.2018
comment
Пожалуйста, проверьте журнал... Я думаю, произошла ошибка. - person Saurabh Vadhva; 20.03.2018
comment
я хочу проверить с добавлением номера отправителя, где я добавил ... - person ; 20.03.2018
comment
нет ошибки в журнале cat - person ; 20.03.2018
comment
Тогда я не знаю, в чем проблема, потому что она отлично работает на моем телефоне. - person Saurabh Vadhva; 20.03.2018
comment
мм до сих пор не работает - person ; 20.03.2018
comment
если вы не возражаете, можете ли вы добавить свою работу в girhub или google drive? - person ; 20.03.2018
comment
На самом деле я реализовал это в некоторых проектах, и этот проект является частным, поэтому я не могу поделиться. - person Saurabh Vadhva; 20.03.2018
comment
Если вы можете поделиться со мной своим кодом, я проверю его и, возможно, смогу решить проблему. - person Saurabh Vadhva; 20.03.2018
comment
хорошо, я поделюсь - person ; 21.03.2018
comment
ок спасибо..буду ждать - person Saurabh Vadhva; 21.03.2018
comment
Я создаю новый проект и все такое :) - person ; 21.03.2018
comment
ок проверю.. - person Saurabh Vadhva; 21.03.2018
comment
спасибо буду ждать - person ; 21.03.2018
comment
сделано .. Я поделюсь с вами кодом. - person Saurabh Vadhva; 21.03.2018
comment
действительно большое спасибо - person ; 21.03.2018
comment
Проверьте это там...drive.google.com/open?id=1KXfPeFRN2dv4vBkK- LBoXDeP1V5eYbzo - person Saurabh Vadhva; 21.03.2018
comment
Вы проверили мой код?? - person Saurabh Vadhva; 21.03.2018
comment
проверяю надеюсь получится - person ; 21.03.2018
comment
хорошо, дай мне знать. - person Saurabh Vadhva; 21.03.2018
comment
Вы видели, где вы делаете ошибки??? - person Saurabh Vadhva; 21.03.2018
comment
да много ошибок ;) - person ; 21.03.2018
comment
Исправьте свою ошибку и продолжайте в том же духе.... - person Saurabh Vadhva; 21.03.2018
comment
хорошо, теперь работает шарм из-за тебя :) - person ; 21.03.2018
comment
можете ли вы повторно отправить разрешенный код пользователя 9427911 - person Pramesh Bhalala; 13.05.2021