【问题标题】:Reading OTP automatically on Android [duplicate]在Android上自动读取OTP [重复]
【发布时间】:2018-03-20 09:16:17
【问题描述】:

我正在开发一个 Android 应用程序,其中服务器发送一个 OTP,用户需要在应用程序中输入这个 OTP,以注册我的应用程序,我想要的是,我的应用程序应该能够自动读取服务器发送的 OTP。 .我正在尝试实现自动检测 OTP 以在收到 OTP 时编辑文本,我尝试过但没有任何改进请帮我找出错误

Readsms.class

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) {}
    }

}

Otp.class

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>

【问题讨论】:

  • 在 logcat 中是否有任何错误?
  • logcat 中没有显示错误
  • Otp Sms = new Otp(); 在这里,您正在创建活动的新对象,因此它无法按预期工作。你需要做的是,你需要实现Interface来实现,你想要的。
  • 如何复制兄弟?路西法..如果你能用那个答案回答这个问题
  • 您的问题是链接的重复,但是您的实际问题是,如何将数据从广播接收器发送到您的活动的编辑文本。

标签: android server one-time-password


【解决方案1】:

请使用此代码 创建短信阅读器广播接收器

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
        }
    }
};

【讨论】:

  • 我在哪里添加发件人号码?
  • 我已经用这个代码获取了发件人号码 myIntent.putExtra("number", senderNum);在接收器类中。如果您想使用该发件人号码,则可以使用此最终 String sendernumber = intent.getStringExtra("number"); 获取该号码在接收器方法中。
  • 我试过了,但不是 wrokd..“AZ-PSDSSL”我想要这个作为发件人姓名..
  • 所以你无法获取 otp....对吗?
  • 可以分享一下那边的OTP信息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2015-08-31
相关资源
最近更新 更多