wake-up-neo.com

Android - Eingehende Nachrichten abhören SMS Nachrichten abhören

Ich versuche, eine Anwendung zum Überwachen eingehender SMS) Nachrichten zu erstellen und ein Programm über eingehende SMS zu starten. Außerdem sollte der Inhalt aus der SMS gelesen werden.

Arbeitsablauf:

  • SMS an Android Gerät gesendet
  • selbstausführbare Anwendung
  • Lesen Sie die SMS Informationen
148
iShader
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());
                }
            }
        }
    }
}

Hinweis: Fügen Sie in Ihrer Manifest-Datei den BroadcastReceiver-

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

Fügen Sie diese Berechtigung hinzu:

<uses-permission Android:name="Android.permission.RECEIVE_SMS" />
258
Vineet Shukla

Beachten Sie, dass Ihr Code auf einigen Geräten ohne Android nicht funktioniert: priority = "1000" in intent filter:

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

Und hier sind einige Optimierungen:

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

Hinweis :
Der Wert muss eine Ganzzahl sein, z. B. "100". Höhere Zahlen haben eine höhere Priorität. Der Standardwert ist 0. Der Wert muss größer als -1000 und kleiner als 1000 sein.

Hier ist ein Link.

62
stefan.nsk

@ Mike M. und ich haben ein Problem mit der akzeptierten Antwort gefunden (siehe unsere Kommentare):

Grundsätzlich macht es keinen Sinn, die for-Schleife zu durchlaufen, wenn die mehrteilige Nachricht nicht jedes Mal verkettet wird:

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

Beachten Sie, dass wir nur msgBody auf den Zeichenfolgenwert des jeweiligen Teils der Nachricht setzen, unabhängig davon, auf welchem ​​Index wir uns befinden, wodurch die gesamte Schleife durch die verschiedenen Teile des SMS ausgeführt wird. Nachricht nutzlos, da sie nur auf den allerletzten Indexwert gesetzt wird. Stattdessen sollten wir += Verwenden oder, wie Mike bemerkte, StringBuilder:

Alles in allem sieht mein SMS Empfangscode so aus:

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
}

Stellen Sie diese Antwort einfach auf den Tisch, falls jemand die gleiche Verwirrung hat.

5
Ruchir Baronia

Das habe ich benutzt!

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

        }
    }
}
3
Debasish Ghosh

Wenn jemand wie ich auf Xamarin Android die gleiche Funktion (Lesen von OTP mithilfe empfangener SMS) ausführt:

  1. Fügen Sie diesen Code zu Ihrer AndroidManifest.xml-Datei hinzu:

    <receiver Android:name=".listener.BroadcastReveiverOTP">
    <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.BROADCAST_SMS" />
    <uses-permission Android:name="Android.permission.READ_SMS" />
    
  2. Erstellen Sie dann Ihre BroadcastReveiver-Klasse in Ihrem Android - Projekt.

    [BroadcastReceiver(Enabled = true)] [IntentFilter(new[] { "Android.provider.Telephony.SMS_RECEIVED" }, Priority = (int)IntentFilterPriority.HighPriority)] 
    public class BroadcastReveiverOTP : BroadcastReceiver {
            public static readonly string INTENT_ACTION = "Android.provider.Telephony.SMS_RECEIVED";
    
            protected string message, address = string.Empty;
    
            public override void OnReceive(Context context, Intent intent)
            {
                if (intent.HasExtra("pdus"))
                {
                    var smsArray = (Java.Lang.Object[])intent.Extras.Get("pdus");
                    foreach (var item in smsArray)
                    {
                        var sms = SmsMessage.CreateFromPdu((byte[])item);
                        address = sms.OriginatingAddress;
                        if (address.Equals("NotifyDEMO"))
                        {
                            message = sms.MessageBody;
                            string[] pin = message.Split(' ');
                            if (!string.IsNullOrWhiteSpace(pin[0]))
                            { 
                                    // NOTE : Here I'm passing received OTP to Portable Project using MessagingCenter. So I can display the OTP in the relevant entry field.
                                    MessagingCenter.Send<object, string>(this,MessengerKeys.OnBroadcastReceived, pin[0]);
                            }
                            }
                    }
                }
            }
    }
    
  3. Registrieren Sie diese BroadcastReceiver-Klasse in Ihrer MainActivity-Klasse in Android Project:

    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity {
    
            // Initialize your class
            private BroadcastReveiverOTP _receiver = new BroadcastReveiverOTP ();
    
            protected override void OnCreate(Bundle bundle) { 
                    base.OnCreate(bundle);
    
                    global::Xamarin.Forms.Forms.Init(this, bundle);
                    LoadApplication(new App());
    
                    // Register your receiver :  RegisterReceiver(_receiver, new IntentFilter("Android.provider.Telephony.SMS_RECEIVED"));
    
            }
    }
    

Wenn Sie die Absicht für eine geöffnete Aktivität behandeln möchten, können Sie PendintIntent verwenden (Führen Sie die folgenden Schritte aus):

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) {
        }
    }
} 

manifest:

<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"));

            }

berechtigungen:

<uses-permission Android:name="Android.permission.RECEIVE_SMS" />
<uses-permission Android:name="Android.permission.READ_SMS" />
<uses-permission Android:name="Android.permission.SEND_SMS" />
2
AskQ

broadcast-Implementierung auf Kotlin:

 private class SmsListener : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        Log.d(TAG, "SMS Received!")

        val txt = getTextFromSms(intent?.extras)
        Log.d(TAG, "message=" + txt)
    }

    private fun getTextFromSms(extras: Bundle?): String {
        val pdus = extras?.get("pdus") as Array<*>
        val format = extras.getString("format")
        var txt = ""
        for (pdu in pdus) {
            val smsmsg = getSmsMsg(pdu as ByteArray?, format)
            val submsg = smsmsg?.displayMessageBody
            submsg?.let { txt = "$txt$it" }
        }
        return txt
    }

    private fun getSmsMsg(pdu: ByteArray?, format: String?): SmsMessage? {
        return when {
            SDK_INT >= Build.VERSION_CODES.M -> SmsMessage.createFromPdu(pdu, format)
            else -> SmsMessage.createFromPdu(pdu)
        }
    }

    companion object {
        private val TAG = SmsListener::class.Java.simpleName
    }
}

Hinweis: Fügen Sie in Ihrer Manifest-Datei den BroadcastReceiver-

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

Fügen Sie diese Berechtigung hinzu:

<uses-permission Android:name="Android.permission.RECEIVE_SMS" />
0
Serg Burlaka