-2
public class SmsReceiver extends BroadcastReceiver { 

    private static SmsListener mListener; 

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

     final Bundle data = intent.getExtras(); 

     final 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. 

      Log.i("Sender id ",sender); 

      String messageBody = smsMessage.getMessageBody(); 
      Log.i("get Message body ",messageBody); 
      messageBody=smsMessage.getDisplayMessageBody(); 
      Log.i("Message Body ",messageBody); 

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

в fragement/диалоговый призванию:автоматически смски чтения не работает в андроиде

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

@Override 
    public void onResume() { 

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

     super.onResume(); 
    } 

    @Override 
    public void onPause() { 
     Log.i("In pause ","pause"); 
     super.onPause(); 
     SmsReceiver.bindListener(new SmsListener() { 
      @Override 
      public void messageReceived(String messageText) { 
       Log.d("Text",messageText); 
       Toast.makeText(getContext(),"Message: "+messageText,Toast.LENGTH_LONG).show(); 
      } 
     }); 

    } 



<receiver android:name="services.SmsReceiver"> 
      <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" /> 

Я не получаю сообщение об ошибке и ничего не печатает в журнале также. Не знаю, что случилось. Даже без печати от широковещательного приемника. Я думаю, что код в onResume также не выполняется.

+1

имеет регистрации смс-р eceiver на 'AndroidMenifest'? –

+0

Какое устройство вы тестируете, это Xiaomi? –

+0

есть. @android_griezmann –

ответ

1

Для Xiaomi Разрешения Dialog Используйте это Читать все SMS

private void displaySmsLog() { 
     Uri allMessages = Uri.parse("content://sms/"); 
     //Cursor cursor = managedQuery(allMessages, null, null, null, null); Both are same 
     Cursor cursor = getActivity().getContentResolver().query(allMessages, null, 
       null, null, null); 

    if (cursor!=null) { 

    while (cursor.moveToNext()) { 
     for (int i = 0; i < cursor.getColumnCount(); i++) { 
      Log.d(cursor.getColumnName(i) + "", cursor.getString(i) + ""); 
     } 
     Log.d("One row finished", 
       "**************************************************"); 
    } 
} 
     else { 


} 

    } 

Надеется, что это помогает. :)

+0

Do I нужно проверить разрешение в классе вещательного приемника? –

+0

Это разрешение на запуск. Проверьте его активность или фрагментацию перед чтением смс. –

0

Поскольку сво Xiaomi устройства, он отрицает смс чтение/получить разрешение либо вам придется вручную переключаться на разрешение или вы можете попробовать следующий код просто чтобы Xiaomi знать ваше приложение должно прочитать/получить смс и он покажет диалог разрешения читать смс: -

Cursor cursor = getActivity().getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null); 
    if (cursor == null) { 
     return; 
    } 
    try { 
     if (cursor.moveToFirst()) { 
      // must check the result to prevent exception 
       //This will show a permission dialog to let app read /receive sms 
       } 
      } while (cursor.moveToNext()); 
     } else { 
      Log.e(this.getClass().getSimpleName(), "No SMS"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     cursor.close(); 
    } 
+0

Нужно ли мне проверять разрешение в классе вещательного приемника? –

+0

вы можете сделать в деятельности/фрагменте onStart() непосредственно перед тем, как вы получите получение смс. например, если вы сделали OTP-активность/фрагмент, где пользователь ждет, пока приложение получает otp, –