Android – SMS-Broadcast-Empfänger

Lesezeit: 4 Minuten

Android SMS Broadcast Empfanger
madu

Ich habe versucht, dieses Programm zum Laufen zu bringen, aber bisher ohne Erfolg. Ich kann nicht finden, wo ich falsch mache. Ich bin mir nicht sicher, ob etwas mit dem Code oder dem Debuggen nicht stimmt.

Ich versuche benachrichtigt zu werden, wenn eine neue SMS eintrifft.

Hier ist mein Programm:

package Technicaljar.SMSBroadcastReceiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

public class SMSBroadcastReceiver extends BroadcastReceiver {

        private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
        private static final String TAG = "SMSBroadcastReceiver";

        @Override
        public void onReceive(Context context, Intent intent) {
             Log.i(TAG, "Intent recieved: " + intent.getAction());

                if (intent.getAction() == SMS_RECEIVED) {
                    Bundle bundle = intent.getExtras();
                    if (bundle != null) {
                        Object[] pdus = (Object[])bundle.get("pdus");
                        final SmsMessage[] messages = new SmsMessage[pdus.length];
                        for (int i = 0; i < pdus.length; i++) {
                            messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                        }
                        if (messages.length > -1) {
                            Log.i(TAG, "Message recieved: " + messages[0].getMessageBody());
                        }
                    }
                }
           }
    }

Und die Manifestdatei:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="Technicaljar.SMSBroadcastReceiver"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true" >
        <receiver android:name=".SMSBroadcastReceiver">
            <intent-filter>
                <action android:name="android.provider.telephony.SMS_RECEIVED"></action>
            </intent-filter>
        </receiver>

    </application>
    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest> 

Ich sende SMS über Telnet und kann im Logcat keine von Intent empfangenen Nachrichten sehen. Hier ist mein Logcat vom Zeitpunkt der Installation.

D/AndroidRuntime(  478): 
D/AndroidRuntime(  478): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
D/AndroidRuntime(  478): CheckJNI is ON
D/AndroidRuntime(  478): --- registering native functions ---
D/AndroidRuntime(  478): Shutting down VM
D/dalvikvm(  478): Debugger has detached; object registry had 1 entries
I/AndroidRuntime(  478): NOTE: attach of thread 'Binder Thread #3' failed
D/Mms:app (  220): getSmsNewMessageNotificationInfo: count=14, first addr=12345, thread_id=4
D/dalvikvm(  151): GC_EXPLICIT freed 391 objects / 22552 bytes in 65ms
D/dalvikvm(  220): GC_EXPLICIT freed 926 objects / 44840 bytes in 73ms

Die SMS scheint also vom Emulator empfangen zu werden, sieht aber so aus, als würden keine Absichten ausgelöst. Was mache ich hier falsch? Muss ich diesen Receiver nach der Installation irgendwie „starten“? Denn wenn ich installiere, bekomme ich

 [2010-11-07 21:24:41 - SMSBroadcastReceiver] No Launcher activity found!
[2010-11-07 21:24:41 - SMSBroadcastReceiver] The launch will only sync the application package on the device!

Deshalb frage ich mich, ob hier etwas nicht stimmt.

  • Ich mache etwas ähnliches HIER!!! stackoverflow.com/questions/14452808/…

    – Etienne Lawlor

    22. Januar 2013 um 20:42 Uhr

  • Soll man nicht verwenden intent.getAction().equals(SMS_RECEIVED) anstatt intent.getAction() == SMS_RECEIVED

    – Peter Chaula

    1. November 2016 um 15:54 Uhr

android.provider.Telephony.SMS_RECEIVED hat ein Kapital Tund Ihre im Manifest nicht.

Bitte bedenken Sie, dass dies Intent Aktion ist nicht dokumentiert.

  • Vielen Dank CommonWare. Das war das Problem. Es funktioniert jetzt gut. Danke. Kann ich auch fragen, warum diese Absicht nicht dokumentiert ist?

    – madu

    7. November 2010 um 14:35 Uhr


  • Ich wusste nicht, dass es nicht dokumentiert ist. Ich sehe viele Leute, die diese Absicht verwenden, von der ich nie gedacht hätte, dass sie nicht dokumentiert ist. Danke für die Info.

    – madu

    7. November 2010 um 15:39 Uhr

  • @Janusz: Nein, leider. Die Tatsache, dass 99 % des für die Verarbeitung eingehender SMS erforderlichen Codes im SDK vorhanden sind und diese Konstante nicht, legt nahe, dass sich diese Konstante wahrscheinlich nicht ändern wird. Ich erinnere mich jedoch nicht an offizielle Äußerungen in dieser Richtung, und sie haben es trotz ausreichender Gelegenheit dazu sicherlich nicht in das SDK aufgenommen. Entwickler von SMS-Clients müssen sich einfach des Problems bewusst sein und neue Android-Versionen wie ein Falke beobachten.

    – CommonsWare

    28. Dezember 2010 um 10:22 Uhr

  • @CommonsWare Erkennen, dass ‘T’ der Hawk Eye-Job war! Hut ab!

    – Aman Alam

    23. Mai 2013 um 11:12 Uhr

  • Es ist jetzt hier in API 19 dokumentiert developer.android.com/reference/android/provider/…

    – Muhammad Babar

    25. September 2014 um 6:46 Uhr

1646377388 196 Android SMS Broadcast Empfanger
anshul

Ich habe Ihren Code ausprobiert und festgestellt, dass er nicht funktioniert.

Ich musste mich ändern

if (intent.getAction() == SMS_RECEIVED) {

zu

if (intent.getAction().equals(SMS_RECEIVED)) {

Jetzt geht es. Es ist nur ein Problem mit Java, das die Gleichheit überprüft.

  • FYI: Es ist immer besser, .equals(..) aus einer Nicht-Null-Zeichenfolge aufzurufen. zB – if (SMS_RECEIVED.equals(intent.getAction())) {

    – Yaadm

    24. Dezember 2013 um 6:39 Uhr


1646377389 267 Android SMS Broadcast Empfanger
Das es

Beachten Sie auch, dass die Hangouts-Anwendung meinen BroadcastReceiver derzeit daran hindert, SMS-Nachrichten zu empfangen. Ich musste die SMS-Funktion in der Hangouts-Anwendung deaktivieren (Einstellungen->SMS->SMS aktivieren), bevor mein SMS BroadcastReceived ausgelöst wurde.

Bearbeiten: Es scheint, als würden einige Anwendungen Broadcast() für die Absicht abbrechen, wodurch andere Anwendungen daran gehindert werden, die Absicht zu erhalten. Die Lösung ist die Erhöhung der android:priority Attribut in der intent-filter Schild:

<receiver android:name="com.company.application.SMSBroadcastReceiver" >
  <intent-filter android:priority="500">
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  </intent-filter>
</receiver>

Weitere Details finden Sie hier: Durch Aktivieren der SMS-Unterstützung in Hangouts 2.0 wird der BroadcastReceiver von SMS_RECEIVED in meiner App unterbrochen

  • android-developers.blogspot.no/2011/01/… <-- Lesen Sie den Teil über die Suche nach Änderungen, die von anderen Apps vorgenommen wurden, und auch über die Bedeutung der Priorität "0".

    – Lennart Rolland

    5. November 2014 um 0:11 Uhr

1646377390 221 Android SMS Broadcast Empfanger
Cathy

intent.getAction().equals(SMS_RECEIVED)

Ich habe es erfolgreich ausprobiert.

Android SMS Broadcast Empfanger
Phil Haigh

Ihr Rundfunkempfänger muss angeben android:exported="true" um Sendungen zu empfangen, die außerhalb Ihrer eigenen Anwendung erstellt wurden. Mein Broadcast-Empfänger ist im Manifest wie folgt definiert:

<receiver
    android:name=".IncomingSmsBroadcastReceiver"
    android:enabled="true"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

Wie unten angemerkt, ist exported=”true” der Standardwert, sodass Sie diese Zeile weglassen können. Ich habe es drin gelassen, damit die Diskussionskommentare Sinn machen.

  • Nö. Wenn ein Empfänger über einen Intent-Filter verfügt, wird dieser automatisch exportiert. Sehen developer.android.com/guide/topics/manifest/…

    – Adam Nybäck

    2. Mai 2013 um 18:49 Uhr

  • Fairer Kommentar. Ich vermute, dass sich dies in einer neueren Version von Android geändert haben könnte, mein Code wurde ursprünglich gegen Android 4.0 entwickelt. Ich werde die Antwort aktualisieren.

    – Phil Haigh

    7. Mai 2013 um 10:43 Uhr

1646377391 80 Android SMS Broadcast Empfanger
Pradeep Sheoran

Der aktualisierte Code lautet:

 private class SMSReceiver extends BroadcastReceiver {
                private Bundle bundle;
                private SmsMessage currentSMS;
                private String message;

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

                    if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
                        bundle = intent.getExtras();
                        if (bundle != null) {
                            Object[] pdu_Objects = (Object[]) bundle.get("pdus");
                            if (pdu_Objects != null) {

                                for (Object aObject : pdu_Objects) {

                                    currentSMS = getIncomingMessage(aObject, bundle);

                                    String senderNo = currentSMS.getDisplayOriginatingAddress();

                                    message = currentSMS.getDisplayMessageBody();
                                    Toast.makeText(OtpActivity.this, "senderNum: " + senderNo + " :\n message: " + message, Toast.LENGTH_LONG).show();
                                }
                                this.abortBroadcast();
                                // End of loop
                            }
                        }
                    } // bundle null
                }
            }

        private SmsMessage getIncomingMessage(Object aObject, Bundle bundle) {
            SmsMessage currentSMS;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                String format = bundle.getString("format");
                currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format);
            } else {
                currentSMS = SmsMessage.createFromPdu((byte[]) aObject);
            }
    return currentSMS;
}

älterer Code war:

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

    messages = new SmsMessage[pdus.length];

    for (int i = 0; i < messages.length; i++)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            String format = myBundle.getString("format");
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);
        }
        else {
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        }
        strMessage += "SMS From: " + messages[i].getOriginatingAddress();
        strMessage += " : ";
        strMessage += messages[i].getMessageBody();
        strMessage += "\n";
    } 

Die einfache SYntax des Codes lautet:

private class SMSReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
            SmsMessage[] smsMessages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
            for (SmsMessage message : smsMessages) {
                // Do whatever you want to do with SMS.
            }
        }
    }
}

  • Nö. Wenn ein Empfänger über einen Intent-Filter verfügt, wird dieser automatisch exportiert. Sehen developer.android.com/guide/topics/manifest/…

    – Adam Nybäck

    2. Mai 2013 um 18:49 Uhr

  • Fairer Kommentar. Ich vermute, dass sich dies in einer neueren Version von Android geändert haben könnte, mein Code wurde ursprünglich gegen Android 4.0 entwickelt. Ich werde die Antwort aktualisieren.

    – Phil Haigh

    7. Mai 2013 um 10:43 Uhr

1646377391 549 Android SMS Broadcast Empfanger
Jared Burrows

Heute darüber gestolpert. Verwenden Sie für jeden, der heutzutage einen SMS-Empfänger codiert, diesen Code anstelle des veralteten in OP:

SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent);
SmsMessage smsMessage = msgs[0];

  • Müssen Sie dafür Laufzeitberechtigungen aktivieren?

    – Harscha

    3. Februar 2021 um 17:23 Uhr

932120cookie-checkAndroid – SMS-Broadcast-Empfänger

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy