2016-04-26 2 views
-2

Я использую широковещательный приемник в своем приложении для чтения OTP, отправленного с сервера, я не упоминал никаких разрешений в файле manifest.xml, но он не читает OTP. Я не знаю, где проблема. Может кто-нибудь помочь мне исправить это? Пожалуйста, помогите мне.Приемник широковещательной передачи не получает смс в андроиде?

public BroadcastReceiver br = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     final Bundle bundle = intent.getExtras(); 
     try { 
      if (bundle != null) { 
       Object[] pdusObj = (Object[]) bundle.get("pdus"); 
       assert pdusObj != null; 
       for (Object aPdusObj : pdusObj) { 
        @SuppressWarnings("deprecation") SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) aPdusObj); 
        String phoneNumber = currentMessage.getDisplayOriginatingAddress(); 
        String message = currentMessage.getDisplayMessageBody(); 

        Log.e(s_szTAG, "Received SMS: " + message + ", Sender: " + phoneNumber); 

        // checking sms sender address.... 
        if (phoneNumber.toLowerCase().contains("+919971599909".toLowerCase())) { 
         // verification code from sms 
         m_szOtpCode = getVerificationCode(message); 
         assert m_szOtpCode != null; 
         String input = m_szOtpCode.trim(); 

         Log.e(s_szTAG, "OTP received: " + m_szOtpCode); 
         COTPVerificationDataStorage.getInstance().setM_szOtp(input);// getting otp from SMS and set to otpverificationstorage class 

        } else { 
         return; 
        } 

       } 
      } 
     } catch (Exception e) { 
      Log.e(s_szTAG, "Exception: " + e.getMessage()); 
     } 
    } 

    @SuppressWarnings("JavaDoc") 
    private String getVerificationCode(String message) { 
     String code; 
     int index = message.indexOf(":"); 

     if (index != -1) { 
      int start = index + 2; 
      int length = 6; 
      code = message.substring(start, start + length); 
      return code; 
     } 
     COTPVerificationDataStorage.getInstance().setM_szOtp(m_szOtpCode); 
     return null; 
    } 
}; 
private IntentFilter inf; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    m_Main = inflater.inflate(R.layout.otp_auto_verified, container, false); 

    inf = new IntentFilter(); 
    inf.addAction("android.provider.Telephony.SMS_RECEIVED"); 


    getUserDetails();// getuser deatails.... 
    init();// initialize controls... 
    return m_Main; 

} 
+0

создать на классе приемника .. поместить этот код внутри класса и зарегистрировать его в манифесте .. – Sanoop

+0

вы не регистрируете приемник br. –

+0

Почему? Тогда, как зарегистрироваться – John

ответ

0

Чтобы прочитать SMS через BroadReciever, вы либо можете зарегистрировать YourReciever в манифесте, либо в YourActivity. иначе вы не можете слушать трансляции.

разрешение требуется

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

статическая регистрация

<receiver android:name=".YourSmsReciever"> 
    <intent-filter android:priority="99999"> 
     <action android:name="android.provider.telephony.SMS_RECIEVED"></action> 
    </intent-filter> 
</receiver> 

динамическая регистрация

  class YourActivity extends Activity{ 
    //all remaining life cycle methods will goes here 

       YourReciever yourReciever = new YourReciever; 
       public void onResume(params){ 
        IntentFilter mIntentFilter = new IntentFilter(); 
        mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
        registerReceiver(yourReceiver, mIntentFilter); 
       } 
       public void onPause(params){ 
        unRregisterReceiver(yourReceiver); 
       } 
      } 
+0

Я регистрирую приемник в onCreate, в чем проблема в этом – John

+0

, если вы не unRegister, тогда это вызовет проблемы. onPause & onResume - предпочтительные места для преодоления этих проблем. вы также можете использовать onCreate и onDestroy. – shobhan

+0

Если я зарегистрирую широковещательный приемник динамически, я могу сделать разрешение в манифесте – John

0

попробовать регистрируя приемник

public class ReceiverSMS extends BroadcastReceiver { 

    // your onReceive code 
} 

и проявляется ..

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

Вы должны зарегистрировать трансляцией приемник, как показано ниже, и объявить необходимые разрешения в явном

 IntentFilter mIntentFilter = new IntentFilter(); 
    mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
    // mIntentFilter.setPriority(2147483647); 
    registerReceiver(optReceiver, mIntentFilter);