2011-08-17 19 views
127

Próbuję utworzyć aplikację do monitorowania przychodzących wiadomości SMS i uruchamiać program poprzez przychodzące wiadomości SMS, a także powinien odczytać zawartość z SMS-a.Android - Słuchaj przychodzących wiadomości SMS

Workflow:

SMS wysyłane do urządzenia Android samodzielnego pliku wykonywalnego aplikacji Przeczytaj informacje SMS

Jeśli ktoś może mi pomóc!

+1

Wiem, aby utworzyć aplikację do wysyłania wiadomości SMS, ale tutaj muszę utworzyć aplikację SMS, która pobiera informacje z SMS i zapisuje je w bazie danych SQLite ..... Jak mogę rozwinąć taką aplikację – iShader

+0

@iShader Mam nadzieję, że udało Ci się pomyślnie utworzyć aplikację, chciałem tylko wiedzieć, w jaki sposób udało Ci się zsynchronizować wiadomości w urządzeniu i na serwerze. –

+0

Zobacz ten blog http://www.gadgetsaint.com/android/read -sms-messages-android/#. WLrJHRJ97fY – ASP

Odpowiedz

239
public class SmsListener extends BroadcastReceiver{ 

    private SharedPreferences preferences; 

    @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++){ 
         msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
         msg_from = msgs[i].getOriginatingAddress(); 
         String msgBody = msgs[i].getMessageBody(); 
        } 
       }catch(Exception e){ 
//       Log.d("Exception caught",e.getMessage()); 
       } 
      } 
     } 
    } 
} 

Uwaga: W pliku manifestu dodać BroadcastReceiver-

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

Dodaj to uprawnienie:

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

Czy możesz mnie zrozumieć, dlaczego używasz drugiego odbiornika? – WindRider

+2

@VineetShukla, czy możesz wyjaśnić, co to jest pdus? –

+9

użyj Intents.SMS_RECEIVED_ACTION zamiast twardego. –

52

pamiętać, że w niektórych urządzeniach kod nie będzie działać bez android: priorytet = "1000" w zamyśle filtra:

<receiver android:name=".listener.SmsListener"> 
    <intent-filter android:priority="1000"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

A oto niektóre optymalizacje:

public class SmsListener extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) { 
      for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) { 
       String messageBody = smsMessage.getMessageBody(); 
      } 
     } 
    } 
} 

Note:
Wartość musi być liczbą całkowitą, takie jak "100". Wyższe liczby mają wyższy priorytet. Domyślna wartość to 0. Wartość musi być większa niż -1000 i mniej niż 1000.

Here's a link.

+26

Ta odpowiedź może być bardziej elegancka, ale wymaga API 19. Tylko FYI dla innych. – baekacaek

+8

Zgodnie z [this] (http://developer.android.com/guide/topics/manifest/intent-filter-element.html), 'android: priority' nie może być wyższy niż' 1000' (lub mniejszy niż '- 1000'). – craned

+2

To nie działa na Xiaomi Redmi Note 3 Pro z systemem Android 5.1. Wszyscy dostarczają tego rozwiązania, ale wydaje się, że nie działa to dla mnie. – Sermilion

4

@Mike M. i znalazłem problem z przyjętą odpowiedzi (patrz nasze komentarze):

Zasadniczo nie ma sensu przechodzi do pętli, jeśli nie są konkatenację wieloczęściowy wiadomość za każdym razem:

for (int i = 0; i < msgs.length; i++) { 
    msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
    msg_from = msgs[i].getOriginatingAddress(); 
    String msgBody = msgs[i].getMessageBody(); 
} 

Zauważ, że wystarczy ustawić msgBody do wartości ciągu odpowiedniej części wiadomości bez względu w jakim indeksie jesteśmy, co powoduje, że cały punkt zapętlenia różnych części wiadomości SMS jest bezużyteczny, ponieważ zostanie ustawiony na ostatnią wartość indeksu. Zamiast tego powinniśmy używać +=, lub jak Mike zauważył, StringBuilder:

W sumie Oto co mój SMS otrzymaniu kodu wygląda następująco:

if (myBundle != null) { 
    Object[] pdus = (Object[]) myBundle.get("pdus"); // pdus is key for SMS in bundle 

    //Object [] pdus now contains array of bytes 
    messages = new SmsMessage[pdus.length]; 
    for (int i = 0; i < messages.length; i++) { 
     messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); //Returns one message, in array because multipart message due to sms max char 
     Message += messages[i].getMessageBody(); // Using +=, because need to add multipart from before also 
    } 

    contactNumber = messages[0].getOriginatingAddress(); //This could also be inside the loop, but there is no need 
} 

tylko wprowadzenie tej odpowiedzi tam w przypadku kogoś innego ma takie samo zamieszanie.

1

To jest to, czego użyłem!

public class SMSListener extends BroadcastReceiver { 

    // Get the object of SmsManager 
    final SmsManager sms = SmsManager.getDefault(); 
String mobile,body; 

    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(); 
        mobile=senderNum.replaceAll("\\s",""); 
        body=message.replaceAll("\\s","+"); 


        Log.i("SmsReceiver", "senderNum: "+ senderNum + "; message: " + body); 


        // Show Alert 
        int duration = Toast.LENGTH_LONG; 
        Toast toast = Toast.makeText(context, 
          "senderNum: "+ mobile+ ", message: " + message, duration); 
        toast.show(); 

       } // end for loop 
      } // bundle is null 

     } catch (Exception e) { 
      Log.e("SmsReceiver", "Exception smsReceiver" +e); 

     } 
    } 
} 
1

W przypadku, gdy chcesz obsługiwać intencję na otwartej działalności, można użyć PendintIntent (Complete kroki poniżej):

public class SMSReciver 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.contains("MOB_NUMBER")) { 
          Toast.makeText(context,"",Toast.LENGTH_SHORT).show(); 

          Intent intentCall = new Intent(context, MainActivity.class); 
          intentCall.putExtra("message", currentMessage.getMessageBody()); 

          PendingIntent pendingIntent= PendingIntent.getActivity(context, 0, intentCall, PendingIntent.FLAG_UPDATE_CURRENT); 
          pendingIntent.send(); 
         } 
        } catch (Exception e) { 
        } 
       } 
      } 
     } catch (Exception e) { 
     } 
    } 
} 

oczywisty:

<activity android:name=".MainActivity" 
      android:launchMode="singleTask"/> 
<receiver android:name=".SMSReciver"> 
      <intent-filter android:priority="1000"> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
      </intent-filter> 
     </receiver> 

onNewIntent:

@Override 
     protected void onNewIntent(Intent intent) { 
       super.onNewIntent(intent); 
       Toast.makeText(this, "onNewIntent", Toast.LENGTH_SHORT).show(); 

       onSMSReceived(intent.getStringExtra("message")); 

      } 

uprawnienia:

Powiązane problemy