2016-08-04 4 views
0

Я хочу получить информацию из полученного текстового сообщения. Информация, например, номер телефона отправителя текста и т. Д. Я пытаюсь сделать это с помощью приведенного ниже кода. У меня есть разрешения в манифесте.Получить информацию о текстовом сообщении, полученном в android 6.0.1 API-интерфейс Marshmallow: 23

public void onReceive(Context context, Intent intent) 
{ 
    //---get the SMS message passed in--- 
    Bundle bundle = intent.getExtras(); 
    SmsMessage[] msgs = null; 
    String str = ""; 
    if (bundle != null) 
    { 
     //---retrieve the SMS message received--- 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length]; 
     for (int i=0; i<msgs.length; i++){ 
      msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
      str += "SMS from " + msgs[i].getOriginatingAddress(); 
      str += " :"; 
      str += msgs[i].getMessageBody().toString(); 
      str += "n"; 
     } 
     //---display the new SMS message--- 
     Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
    } 
} 

Это работает. Но не на Marshmallow 6.0.1 API: 23. Кроме того, SmsMessage, createFromPdu и getMessageBody все они устарели. Я не могу найти способ сделать это в Зефире. Пожалуйста, дайте мне решение.

ответ

1
BroadcastReceiver smsReceiver = new BroadcastReceiver(){ 

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

     if (Build.VERSION.SDK_INT < 19) { 
      if(Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())){ 
       Bundle bundle = intent.getExtras();   //---get the SMS message passed in--- 
       SmsMessage[] msgs; 
       String sender; 
       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++){ 
          msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
          sender = msgs[i].getOriginatingAddress(); 
          String messageBody = msgs[i].getMessageBody(); 
          // do things here 
          } 
         } 
        }catch(Exception e){ 
         Log.d("Exception caught",e.getMessage()); 
        } 
       } 
      } 
     } 
     else{ 
      if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) { 
       for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) { 
        String messageBody = smsMessage.getMessageBody(); 
        String sender = smsMessage.getOriginatingAddress(); 
        // do things here 
       } 
      } 
     } 
    } 
}; 

Не забывайте регистрировать приемник. OnCreate:

IntentFilter intentFilter = new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION); 
    intentFilter.setPriority(990); 
    registerReceiver(smsReceiver, intentFilter); 

А также незарегистрировать.

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    unregisterReceiver(smsReceiver); 
    threadTimer.interrupt(); 
} 
+0

О, извините. Я забыл об этом. Я не уверен, но, возможно, вам нужно проверить разрешение программно, находится ли оно в манифесте. Новые версии для Android требуют этого. Например, я попытался написать внешнее хранилище. У меня было разрешение в манифесте, но это было исключение при написании внешнего хранилища. Затем я запросил разрешение программно, и проблема была решена. Возможно, он аналогичен для смс. У меня Android 5.0. Я не могу проверить это сейчас. –

Смежные вопросы