2017-02-10 64 views
0

我试图从邮件中读取OTP,但我无法自动读取它。请告诉我我做错了什么,这里是我的code.i使用棉花糖。谢谢。无法从邮件中读取OTP

这里是我的SmsReceiver类:

public class SmsReceiver extends BroadcastReceiver { 

private static SmsListener mListener; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle data = intent.getExtras(); 

    Object[] pdus = (Object[]) data.get("pdus"); 

    for(int i=0;i<pdus.length;i++){ 
     SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]); 

     String sender = smsMessage.getDisplayOriginatingAddress(); 
     //You must check here if the sender is your provider and not another one with same text. 

     String messageBody = smsMessage.getMessageBody(); 

     //Pass on the text to our listener. 
     mListener.messageReceived(messageBody); 
    } 

} 

public static void bindListener(SmsListener listener) { 
    mListener = listener; 
}} 

这里是接口

public interface SmsListener { 
    public void messageReceived(String messageText); 
    } 

,这是我的活动

public class MyOTP extends BaseActivity implements View.OnClickListener { 

EditText txtotp; 
Button btnSubmitOtp; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.my_otp); 

    txtotp = (EditText) findViewById(R.id.txtOtp); 
    btnSubmitOtp = (Button) findViewById(R.id.btnSubmit); 

    btnSubmitOtp.setOnClickListener(this); 

    SmsReceiver.bindListener(new SmsListener() { 
     @Override 
     public void messageReceived(String messageText) { 
      Log.d("Text",messageText); 
      Toast.makeText(MyOTP.this,"Message: "+messageText,Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

}

+0

检查你manifest.:)Paste您的清单 –

+0

检查权限,如果你已经注册清单文件 – arjun

+0

亚我已经添加权限接收器在我的清单中还注册了接收者。 – Pratik

回答

1

这是我工作的广播接收R类别将读取邮件正文中位数与OTP代码&广播相关类

您需要在menifest文件中添加这些权限

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

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

这里是我的接收机类

public class SmsListener extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 

     if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 
      Bundle bundle = intent.getExtras();   //---get the SMS message passed in--- 
      SmsMessage[] msgs = null; 
      String msg_from; 
      if (bundle != null) { 
       //---retrieve the SMS message received--- 
       try { 
        Object[] pdus = (Object[]) bundle.get("pdus"); 
        msgs = new SmsMessage[pdus.length]; 
        for (int i = 0; i < msgs.length; i++) { 
         if (Build.VERSION.SDK_INT <= 22) { 
          msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
         } else { 
          msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i], bundle.getString("format")); 
         } 
         msg_from = msgs[i].getOriginatingAddress(); 
         if (msg_from.contains("PINSMS")) { 
          String msgBody = msgs[i].getMessageBody(); 
          //String pinNo = msgBody.substring(msgBody.indexOf('"') + 1, msgBody.indexOf('"', msgBody.indexOf('"') + 2)); 
          String pinNo = msgBody.replaceAll("[^0-9]", ""); 
          Log.d("SMS", "From -" + msg_from + " : Body- " + msgBody); 
          //CodeVerification.insertCode(pinNo); 

          // Broadcast to Auto read Code sms 
          final String DISPLAY_MESSAGE_ACTION = context.getPackageName() + ".CodeSmsReceived"; 
          Intent intentCodeSms = new Intent(DISPLAY_MESSAGE_ACTION); 
          intentCodeSms.putExtra("varificationCode", pinNo); 
          context.sendBroadcast(intentCodeSms); 
         } 
        } 
       } catch (Exception e) { 
        Log.d("Exception caught", e.getMessage()); 
       } 
      } 
     } 
    } 
} 

我已经在我的课程编程注册这个接收器,因为我知道OTP短信将在我提交按钮点击后& OTP阅读后取消注册,因为我不想触发这个接收器的每个SMS它在清单中徘徊。

SmsListener smsListener = new SmsListener(); 
    try { 
     unregisterReceiver(smsListener); 
    } catch (Exception e) { 
    } 
    registerReceiver(smsListener, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); 

编辑

将低于接收器在您的活动获得OTP代码

final String DISPLAY_MESSAGE_ACTION = activity.getPackageName() + ".CodeSmsReceived"; 
     try { 
      activity.unregisterReceiver(mHandleMessageReceiver); 
     } catch (Exception e) { 
     } 
     activity.registerReceiver(mHandleMessageReceiver, new IntentFilter(DISPLAY_MESSAGE_ACTION)); 

在收到以下方法的代码将被调用

/** 
    * Receiving Call Log Changed broadcast 
    */ 
    private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent != null && intent.hasExtra("varificationCode")) { 
       String youtOTPcode = intent.getStringExtra("varificationCode")); 
      } 
     } 
    }; 
+0

如何在我的活动中调用它? – Pratik

+0

thanx buddy.its正在运作。 @Divyang – Pratik

+0

@Pratik,很高兴听到这一点 –

0

对于棉花糖你有要求用户授予权限。即使您在manifest中声明它,它也不会被默认给出。 您需要添加代码才能获得棉花糖设备的运行时权限。

现在只是为了检查你可以去settings --> Apps --> go to your in the list --> click on permissions --> Enable SMS permission.然后重新启动你的应用程序,检查它是否工作。

希望它能帮助你。

0

变化MyOtpActivity到

public class MyOTP extends BaseActivity{ 

    EditText txtotp; 
    Button btnSubmitOtp; 
    private UpdateOTPReceiver mUpdateOtpReceiver; 
    private SMSReceiver mSmsReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_otp); 

     txtotp = (EditText) findViewById(R.id.txtOtp); 
     btnSubmitOtp = (Button) findViewById(R.id.btnSubmit); 

     btnSubmitOtp.setOnClickListener(this); 

    } 
    @Override 
    protected void onStart() { 
     super.onStart(); 
     mUpdateOtpReceiver = new UpdateOTPReceiver(); 
     registerReceiver(mUpdateOtpReceiver, new IntentFilter("UPDATE_OTP")); 
     registerSMSReceiver(); 
    } 

    private void registerSMSReceiver() { 
     mSmsReceiver = new SMSReceiver(); 
     registerReceiver(mSmsReceiver, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); 
    } 

    private class UpdateOTPReceiver extends BroadcastReceiver { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent != null) { 
       String msg = intent.getStringExtra("msg"); 
       Toast.makeText(MyOTP.this,"Message: "+msg,Toast.LENGTH_LONG).show(); 

      } 
     } 
    } 
} 

} 

在SmsReceiver

Public class SmsReceiver extends BroadcastReceiver { 


    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle data = intent.getExtras(); 

     Object[] pdus = (Object[]) data.get("pdus"); 

     for (int i = 0; i < pdus.length; i++) { 
      SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]); 

      String sender = smsMessage.getDisplayOriginatingAddress(); 
      //ToDo check your sender 
      String messageBody = smsMessage.getDisplayMessageBody(); 

      Intent updateTokenIntent = new Intent("UPDATE_OTP"); 
      updateTokenIntent.putExtra("msg", getVerificationCode(messageBody)); 
      context.sendBroadcast(updateTokenIntent); 
     } 

    } 

    private String getVerificationCode(String message) { 
     if (message == null) { 
      return null; 
     } 

     int index = message.indexOf("is"); 
     int index_last_length = message.indexOf("."); 
     if (index != -1) { 
      int start = index + 3; 
      return message.substring(start, index_last_length); 
     } 

     return null; 
    } 

}