Senden und Empfangen von SMS und MMS in Android (vor Kit Kat Android 4.4)

131

Ich habe herausgefunden, wie man SMS-Nachrichten sendet und empfängt. Um SMS-Nachrichten zu senden, musste ich die sendTextMessage()und sendMultipartTextMessage()Methoden der SmsManagerKlasse aufrufen . Um SMS-Nachrichten zu empfangen, musste ich einen Empfänger in der AndroidMainfest.xmlDatei registrieren . Dann musste ich die onReceive()Methode der überschreiben BroadcastReceiver. Ich habe unten Beispiele aufgeführt.

MainActivity.java

public class MainActivity extends Activity {
    private static String SENT = "SMS_SENT";
    private static String DELIVERED = "SMS_DELIVERED";
    private static int MAX_SMS_MESSAGE_LENGTH = 160;

    // ---sends an SMS message to another device---
    public static void sendSMS(String phoneNumber, String message) {

        PendingIntent piSent = PendingIntent.getBroadcast(mContext, 0, new Intent(SENT), 0);
        PendingIntent piDelivered = PendingIntent.getBroadcast(mContext, 0,new Intent(DELIVERED), 0);
        SmsManager smsManager = SmsManager.getDefault();

        int length = message.length();          
        if(length > MAX_SMS_MESSAGE_LENGTH) {
            ArrayList<String> messagelist = smsManager.divideMessage(message);          
            smsManager.sendMultipartTextMessage(phoneNumber, null, messagelist, null, null);
        }
        else
            smsManager.sendTextMessage(phoneNumber, null, message, piSent, piDelivered);
        }
    }

    //More methods of MainActivity ...
}

SMSReceiver.java

public class SMSReceiver extends BroadcastReceiver {
    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private static final String ACTION_SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private Context mContext;
    private Intent mIntent;

    // Retrieve SMS
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        mIntent = intent;

        String action = intent.getAction();

        if(action.equals(ACTION_SMS_RECEIVED)){

            String address, str = "";
            int contactId = -1;

            SmsMessage[] msgs = getMessagesFromIntent(mIntent);
            if (msgs != null) {
                for (int i = 0; i < msgs.length; i++) {
                    address = msgs[i].getOriginatingAddress();
                    contactId = ContactsUtils.getContactId(mContext, address, "address");
                    str += msgs[i].getMessageBody().toString();
                    str += "\n";
                }
            }   

            if(contactId != -1){
                showNotification(contactId, str);
            }

            // ---send a broadcast intent to update the SMS received in the
            // activity---
            Intent broadcastIntent = new Intent();
            broadcastIntent.setAction("SMS_RECEIVED_ACTION");
            broadcastIntent.putExtra("sms", str);
            context.sendBroadcast(broadcastIntent);
        }

    }

    public static SmsMessage[] getMessagesFromIntent(Intent intent) {
        Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
        byte[][] pduObjs = new byte[messages.length][];

        for (int i = 0; i < messages.length; i++) {
            pduObjs[i] = (byte[]) messages[i];
        }
        byte[][] pdus = new byte[pduObjs.length][];
        int pduCount = pdus.length;
        SmsMessage[] msgs = new SmsMessage[pduCount];
        for (int i = 0; i < pduCount; i++) {
            pdus[i] = pduObjs[i];
            msgs[i] = SmsMessage.createFromPdu(pdus[i]);
        }
        return msgs;
    }

    /**
    * The notification is the icon and associated expanded entry in the status
    * bar.
    */
    protected void showNotification(int contactId, String message) {
        //Display notification...
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myexample"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.WRITE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:debuggable="true"
        android:icon="@drawable/ic_launcher_icon"
        android:label="@string/app_name" >

        <activity
            //Main activity...
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            //Activity 2 ...
        </activity>
        //More acitivies ...

        // SMS Receiver
        <receiver android:name="com.myexample.receivers.SMSReceiver" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

Ich habe mich jedoch gefragt, ob Sie MMS-Nachrichten auf ähnliche Weise senden und empfangen können. Nach einigen Recherchen werden viele Beispiele in Blogs einfach Intentan die native Messaging-Anwendung übergeben. Ich versuche, eine MMS zu senden, ohne meine Bewerbung zu verlassen. Es scheint keine Standardmethode zum Senden und Empfangen von MMS zu geben. Hat jemand das zum Laufen gebracht?

Ich bin mir auch bewusst, dass der SMS / MMS ContentProvider nicht Teil des offiziellen Android SDK ist, aber ich dachte, dass jemand dies möglicherweise implementieren konnte. Jede Hilfe wird sehr geschätzt.

Aktualisieren

Ich habe BroadcastReceiverder AndroidManifest.xmlDatei ein hinzugefügt , um MMS-Nachrichten zu empfangen

<receiver android:name="com.sendit.receivers.MMSReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />

        <data android:mimeType="application/vnd.wap.mms-message" />
    </intent-filter>
</receiver>

In der MMSReceiver-Klasse kann die onReceive()Methode nur die Telefonnummer abrufen, von der die Nachricht gesendet wurde. Wie können Sie andere wichtige Dinge aus einer MMS abrufen, z. B. den Dateipfad zum Medienanhang (Bild / Audio / Video) oder den Text in der MMS?

MMSReceiver.java

public class MMSReceiver extends BroadcastReceiver {
    private final String DEBUG_TAG = getClass().getSimpleName().toString();
    private static final String ACTION_MMS_RECEIVED = "android.provider.Telephony.WAP_PUSH_RECEIVED";
    private static final String MMS_DATA_TYPE = "application/vnd.wap.mms-message";

     // Retrieve MMS
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();
        String type = intent.getType();

        if(action.equals(ACTION_MMS_RECEIVED) && type.equals(MMS_DATA_TYPE)){

            Bundle bundle = intent.getExtras();

            Log.d(DEBUG_TAG, "bundle " + bundle);
            SmsMessage[] msgs = null;
            String str = "";
            int contactId = -1;
            String address;

            if (bundle != null) {

                byte[] buffer = bundle.getByteArray("data");
                Log.d(DEBUG_TAG, "buffer " + buffer);
                String incomingNumber = new String(buffer);
                int indx = incomingNumber.indexOf("/TYPE");
                if(indx>0 && (indx-15)>0){
                    int newIndx = indx - 15;
                    incomingNumber = incomingNumber.substring(newIndx, indx);
                    indx = incomingNumber.indexOf("+");
                    if(indx>0){
                        incomingNumber = incomingNumber.substring(indx);
                        Log.d(DEBUG_TAG, "Mobile Number: " + incomingNumber);
                    }
                }

                int transactionId = bundle.getInt("transactionId");
                Log.d(DEBUG_TAG, "transactionId " + transactionId);

                int pduType = bundle.getInt("pduType");
                Log.d(DEBUG_TAG, "pduType " + pduType);

                byte[] buffer2 = bundle.getByteArray("header");      
                String header = new String(buffer2);
                Log.d(DEBUG_TAG, "header " + header);

                if(contactId != -1){
                    showNotification(contactId, str);
                }

                // ---send a broadcast intent to update the MMS received in the
                // activity---
                Intent broadcastIntent = new Intent();
                broadcastIntent.setAction("MMS_RECEIVED_ACTION");
                broadcastIntent.putExtra("mms", str);
                context.sendBroadcast(broadcastIntent);

            }
        }

    }

    /**
    * The notification is the icon and associated expanded entry in the status
    * bar.
    */
    protected void showNotification(int contactId, String message) {
        //Display notification...
    }
}

Laut der Dokumentation von android.provider.Telephony :

Broadcast-Aktion: Das Gerät hat eine neue textbasierte SMS-Nachricht empfangen. Die Absicht hat die folgenden zusätzlichen Werte:

pdus- Ein Object[]von byte[]s, das die PDUs enthält, aus denen die Nachricht besteht.

Die zusätzlichen Werte können mit extrahiert werden. getMessagesFromIntent(android.content.Intent) Wenn ein BroadcastReceiver bei der Verarbeitung dieser Absicht auf einen Fehler stößt, sollte er den Ergebniscode entsprechend festlegen.

 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
 public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";

Broadcast-Aktion: Das Gerät hat eine neue datenbasierte SMS-Nachricht empfangen. Die Absicht hat die folgenden zusätzlichen Werte:

pdus- Ein Object[]von byte[]s, das die PDUs enthält, aus denen die Nachricht besteht.

Die zusätzlichen Werte können mit getMessagesFromIntent (android.content.Intent) extrahiert werden. Wenn ein BroadcastReceiver bei der Verarbeitung dieser Absicht auf einen Fehler stößt, sollte er den Ergebniscode entsprechend festlegen.

@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String DATA_SMS_RECEIVED_ACTION = "android.intent.action.DATA_SMS_RECEIVED";

Broadcast-Aktion: Das Gerät hat eine neue WAP PUSH-Nachricht empfangen. Die Absicht hat die folgenden zusätzlichen Werte:

transactionId (Integer) - Die WAP-Transaktions-ID

pduType (Integer) - Der WAP-PDU-Typ`

header (byte[]) - Der Header der Nachricht

data (byte[]) - Die Datennutzlast der Nachricht

contentTypeParameters (HashMap<String,String>) - Alle mit dem Inhaltstyp verknüpften Parameter (aus dem WSP-Inhaltstyp-Header dekodiert)

Wenn ein BroadcastReceiver bei der Verarbeitung dieser Absicht auf einen Fehler stößt, sollte er den Ergebniscode entsprechend festlegen. Der zusätzliche Wert für contentTypeParameters ist eine Zuordnung von Inhaltsparametern, die durch ihre Namen gekennzeichnet sind. Wenn nicht zugewiesene bekannte Parameter gefunden werden, lautet der Schlüssel der Karte 'nicht zugewiesen / 0x ...', wobei '...' der Hex-Wert des nicht zugewiesenen Parameters ist. Wenn ein Parameter No-Value hat, ist der Wert in der Map null.

@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WAP_PUSH_RECEIVED_ACTION = "android.provider.Telephony.WAP_PUSH_RECEIVED";

Update Nr. 2

Ich habe herausgefunden, wie Extras in einem übergeben werden PendingIntent, um von einem empfangen zu werden BroadcastReceiver: Android PendingIntent-Extras, die nicht von BroadcastReceiver empfangen werden

Das Extra wird jedoch an den SendBroadcastReceiver und nicht an den SMSReceiver übergeben . Wie kann ich dem SMSReceiver ein Extra übergeben ?

Update Nr. 3

MMS empfangen

Nachdem ich mehr recherchiert hatte, sah ich einige Vorschläge zur Registrierung von a ContentObserver. Auf diese Weise können Sie erkennen, wenn Änderungen am content://mms-sms/conversationsInhaltsanbieter vorgenommen wurden, und so eingehende MMS erkennen. Hier ist das nächste Beispiel, um dies zum Laufen zu bringen, das ich gefunden habe: Empfangen von MMS

Es gibt jedoch eine Variable mainActivityvom Typ ServiceController. Wo ist die ServiceControllerKlasse implementiert? Gibt es noch andere Implementierungen eines registrierten ContentObserver?

MMS senden

Beim Senden von MMS bin ich auf folgendes Beispiel gestoßen : MMS senden

Das Problem ist, dass ich versucht habe, diesen Code auf meinem Nexus 4 unter Android v4.2.2 auszuführen, und ich erhalte folgende Fehlermeldung:

java.lang.SecurityException: No permission to write APN settings: Neither user 10099 nor current process has android.permission.WRITE_APN_SETTINGS.

Der Fehler wird ausgelöst, nachdem der CarriersContentProvider in der getMMSApns()Methode der APNHelperKlasse abgefragt wurde .

final Cursor apnCursor = this.context.getContentResolver().query(Uri.withAppendedPath(Carriers.CONTENT_URI, "current"), null, null, null, null);

Anscheinend können Sie APNs in Android 4.2 nicht lesen

Was ist die Alternative für alle Anwendungen, die mobile Daten zum Ausführen von Vorgängen verwenden (z. B. das Senden von MMS) und die im Gerät vorhandene Standard-APN-Einstellung nicht kennen?

Update Nr. 4

MMS senden

Ich habe versucht, diesem Beispiel zu folgen: MMS senden

Wie @Sam in seiner Antwort vorgeschlagen hat:

You have to add jsoup to the build path, the jar to the build path and import com.droidprism.*; To do that in android, add the jars to the libs directory first, then configure the project build path to use the jars already in the libs directory, then on the build path config click order and export and check the boxes of the jars and move jsoup and droidprism jar to the top of the build order.

Jetzt erhalte ich keine SecurityException-Fehler mehr. Ich teste jetzt auf einem Nexus 5 auf Android KitKat. Nachdem ich den Beispielcode ausgeführt habe, erhalte ich nach dem Aufruf von einen 200-Antwortcode

MMResponse mmResponse = sender.send(out, isProxySet, MMSProxy, MMSPort);

Ich habe mich jedoch bei der Person erkundigt, an die ich die MMS senden wollte. Und sie sagten, sie hätten die MMS nie erhalten.

toobsco42
quelle
Haben Sie sich dieses Tutorial schon einmal angesehen? maximbogatov.wordpress.com/2011/08/13/mms-in-android
HaemEternal
3
Ja, habe ich. Ich habe versucht, Maxim's Antwort zusammenzusetzen, kann sie aber nicht zum Laufen bringen. Es gibt dort viele Klassen, die android.provider.telephony importieren, was veraltet zu sein scheint.
toobsco42
Und vermutlich haben Sie nach dem Lesen der Antwort von @ Sahil auch Folgendes
HaemEternal
Ich bin mir nicht sicher, wie ich diese Antwort zusammensetzen soll, obwohl sie der Antwort von @ Sahil sehr ähnlich sieht.
toobsco42
Hallo @ toobsco42, können Sie die Lösung für all die oben genannten Fragen finden?
Kamal_tech_view

Antworten:

15

Ich hatte genau das gleiche Problem, das Sie oben beschrieben haben (Galaxy Nexus auf t-mobile USA), weil mobile Daten deaktiviert sind.

In Jelly Bean ist dies: Einstellungen> Datennutzung> mobile Daten

Beachten Sie, dass mobile Daten VOR dem Senden einer MMS ODER dem Empfangen einer MMS aktiviert sein müssen. Wenn ich eine MMS mit deaktivierten mobilen Daten erhalte, erhalte ich eine Benachrichtigung über eine neue Nachricht und die Nachricht mit einem Download-Button. Wenn ich jedoch vorher keine mobilen Daten habe, wird der eingehende MMS-Anhang nicht empfangen. Auch wenn ich es einschalte, nachdem die Nachricht empfangen wurde.

Wenn Ihr Telefonanbieter Ihnen das Senden und Empfangen von MMS ermöglicht, müssen aus irgendeinem Grund die mobilen Daten aktiviert sein, auch wenn Sie Wifi verwenden. Wenn die mobilen Daten aktiviert sind, können Sie MMS empfangen und senden, auch wenn Wifi wird als Ihr Internet auf Ihrem Gerät angezeigt.

Es ist ein echtes Problem, denn wenn Sie es nicht aktiviert haben, kann die Nachricht selbst beim Aktivieren von Mobile Data stark hängen bleiben und möglicherweise einen Neustart des Geräts erfordern.

Manan Sharma
quelle
Außerdem müssen Sie wissen, dass das Senden einer SMS und einer MMS zwei völlig unterschiedliche Dinge im Hintergrund sind. MMS ist eher ein internetbasierter Netzwerkdienst, da zusätzliche Elemente (Medien) mit Text gesendet werden müssen. Der angegebene Code funktioniert gut auf einigen Geräten, auf denen ich getestet habe. ps: du kannst den NOKIA Teil ignorieren.
Manan Sharma
Wenn ich dieses Beispiel ausführe, wird in LogCat Folgendes ausgegeben: 02-24 13: 32: 40.872: V / SendMMSActivity (5686): TYPE_MOBILE_MMS nicht verbunden, Kaution 02-24 13: 32: 40.882: V / SendMMSActivity (5686): Typ ist nicht TYPE_MOBILE_MMS, Kaution Es heißt auch: java.lang.SecurityException: Keine Berechtigung zum Schreiben von APN-Einstellungen: Weder Benutzer 10099 noch der aktuelle Prozess haben android.permission.WRITE_APN_SETTINGS. Es sieht so aus, als ob diese Abfrage nicht ausgeführt werden kann: final Cursor apnCursor = this.context.getContentResolver (). Query (Uri.withAppendedPath (Carriers.CONTENT_URI, "current"), null, null, null, null);
Ich teste
Dies ist auch das gleiche Beispiel, das @Sahil bereitgestellt hat.
toobsco42
7

Es gibt keine offizielle API-Unterstützung, was bedeutet, dass diese nicht für die Öffentlichkeit dokumentiert ist und die Bibliotheken jederzeit geändert werden können. Mir ist klar, dass Sie die Anwendung nicht verlassen möchten, aber hier erfahren Sie, wie Sie dies mit der Absicht tun, dass sich andere fragen.

public void sendData(int num){
    String fileString = "..."; //put the location of the file here
    Intent mmsIntent = new Intent(Intent.ACTION_SEND);
    mmsIntent.putExtra("sms_body", "text");
    mmsIntent.putExtra("address", num);
    mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(fileString)));
    mmsIntent.setType("image/jpeg");
    startActivity(Intent.createChooser(mmsIntent, "Send"));

}

Ich habe noch nicht vollständig herausgefunden, wie man die Zustellung der Nachricht verfolgt, aber dies sollte gesendet werden.

Sie können auf die gleiche Weise wie per SMS über den Empfang von mms informiert werden. Der Absichtsfilter auf dem Empfänger sollte so aussehen.

<intent-filter>
    <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
    <data android:mimeType="application/vnd.wap.mms-message" />
</intent-filter>
user1959417
quelle
Startet dies nicht einfach die native Messaging-App?
toobsco42
1
Ja, tut mir leid. Ich habe gerade gemerkt, dass du schon wusstest, wie man das macht. Ich habe hinzugefügt, wie man MMS empfängt.
user1959417
Vielen Dank, ich habe kürzlich einen Teil der MMS implementiert BroadcastReceiverund die von Intent FilterIhnen gepostete verwendet. Ich werde diese Frage bald aktualisieren.
toobsco42
4

Um eine mms für Android 4.0 api 14 oder höher ohne Berechtigung zum Schreiben von apn-Einstellungen zu senden, können Sie diese Bibliothek verwenden : Rufen Sie mnc- und mcc-Codes von Android ab und rufen Sie dann an

Carrier c = Carrier.getCarrier(mcc, mnc);
if (c != null) {
    APN a = c.getAPN();
    if (a != null) {
        String mmsc = a.mmsc;
        String mmsproxy = a.proxy; //"" if none
        int mmsport = a.port; //0 if none
    }
}

Um dies zu verwenden, fügen Sie Jsoup und Droid Prism Jar zum Build-Pfad hinzu und importieren Sie com.droidprism. *;

Sam Adams
quelle
Hey @Sam, ich habe die JAR-Datei zu meinem Projekt hinzugefügt, erhalte jedoch diesen Fehler in der Zeile, die das Carrier-Objekt instanziiert: Passiert java.lang.NoClassDefFoundError: com.droidprism.Carrier Ihnen das?
toobsco42
Nein. Sie müssen jsoup zum Erstellungspfad hinzufügen, das jar zum Erstellungspfad und com.droidprism importieren. *; Ich werde die Antwort bearbeiten. Um dies in Android zu tun, fügen Sie die Jars zuerst dem libs-Verzeichnis hinzu, konfigurieren Sie dann den Projekterstellungspfad so, dass die bereits im libs-Verzeichnis vorhandenen Jars verwendet werden. Klicken Sie dann im Buildpfad config auf order und export und aktivieren Sie die Kontrollkästchen der Jars und verschieben Sie sie jsoup und droidprism jar ganz oben in der Bauordnung.
Sam Adamsh
Durch Hinzufügen der Jsoup .jar wurde der NoClassDefFoundError behoben. Ich kann jetzt die APN-Einstellungen erhalten. Der nächste Schritt besteht darin, herauszufinden, wie MMS gesendet wird.
toobsco42
3

Ich glaube nicht, dass es SDK-Unterstützung für das Senden von MMS in Android gibt. Schau mal , zumindest habe ich es noch nicht gefunden. Aber ein Mann behauptete, es zu haben. Schauen Sie sich diesen Beitrag an.

Senden Sie MMS von meiner Anwendung in Android

Sahil Mahajan Mj
quelle
Ich habe mir die Kommentare des Beitrags androidbridge.blogspot.com zur Nokia-Implementierung angesehen, und es sieht so aus, als hätten viele Leute Probleme, dies auf ihren Geräten zum Laufen zu bringen.
toobsco42
@ toobsco42 Es gibt also möglicherweise noch keine Unterstützung dafür.
Sahil Mahajan Mj
-2

Ich verstehe die Frustrationen nicht. Warum nicht einfach einen Rundfunkempfänger erstellen, der nach dieser Absicht filtert:

android.provider.Telephony.MMS_RECEIVED

Ich habe etwas weiter nachgesehen und Sie benötigen möglicherweise Zugriff auf Systemebene, um dies zu erhalten (gerootetes Telefon).

j2emanue
quelle
3
Hey @ j2emanue, das Problem ist, nachdem Sie diese Absicht erhalten haben, wie erhalten Sie tatsächlich den Inhalt der MMS? Wie extrahieren Sie diese Komponenten, wenn eine MMS Bild und Text enthält?
toobsco42
aber ich stelle fest, dass es ein zusätzliches Byte-Array gibt, das Sie erhalten können, wenn Sie es so machen, wie ich es erwähnt habe .... byte [] data = intent.getByteArrayExtra ("data"); Ich bin mir nicht sicher, wie ich es analysieren soll, obwohl es mir leid tut.
j2emanue
Ich kann es analysieren. Aber alles, was ich bekommen kann, ist das Thema, von dem die MMS stammen, und die Inhaltsposition, in der der Inhalt der MMS gespeichert ist. Diese URL ist jedoch nicht zugänglich.
toobsco42
-2

SmsListenerClass

public class SmsListener extends BroadcastReceiver {

static final String ACTION =
        "android.provider.Telephony.SMS_RECEIVED";

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

    Log.e("RECEIVED", ":-:-" + "SMS_ARRIVED");

    // TODO Auto-generated method stub
    if (intent.getAction().equals(ACTION)) {

        Log.e("RECEIVED", ":-" + "SMS_ARRIVED");

        StringBuilder buf = new StringBuilder();
        Bundle bundle = intent.getExtras();
        if (bundle != null) {

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

            SmsMessage[] messages = new SmsMessage[pdus.length];
            SmsMessage message = null;

            for (int i = 0; i < messages.length; i++) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    String format = bundle.getString("format");
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);
                } else {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                }

                message = messages[i];
                buf.append("Received SMS from  ");
                buf.append(message.getDisplayOriginatingAddress());
                buf.append(" - ");
                buf.append(message.getDisplayMessageBody());
            }

            MainActivity inst = MainActivity.instance();
            inst.updateList(message.getDisplayOriginatingAddress(),message.getDisplayMessageBody());

        }

        Log.e("RECEIVED:", ":" + buf.toString());

        Toast.makeText(context, "RECEIVED SMS FROM :" + buf.toString(), Toast.LENGTH_LONG).show();

    }
}

Aktivität

@Override
public void onStart() {
    super.onStart();
    inst = this;
}

public static MainActivity instance() {
    return inst;
}

public void updateList(final String msg_from, String msg_body) {

    tvMessage.setText(msg_from + " :- " + msg_body);

    sendSMSMessage(msg_from, msg_body);

}

protected void sendSMSMessage(String phoneNo, String message) {

    try {
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNo, null, message, null, null);
        Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
}

Manifest

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

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