wake-up-neo.com

Android - SMS Rundfunkempfänger

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

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

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 keine in Intent erhaltenen Nachrichten im Protokollfenster 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 worden zu sein, aber es sieht so aus, als würden die Absichten nicht ausgelöst. Was mache ich hier falsch? Muss ich diesen Receiver nach der Installation irgendwie "starten"?

 [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!

Ich frage mich also, ob hier etwas nicht stimmt.

51
madu

Android.provider.Telephony.SMS_RECEIVED hat ein Kapital T und Ihr im Manifest nicht.

Bitte beachten Sie, dass diese Intent-Aktion nicht dokumentiert ist.

70
CommonsWare

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, wenn Java die Gleichheit überprüft.

17
anshul

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

Bearbeiten: Es sieht so aus, als würden manche Anwendungen die Absicht abbrennen, wodurch andere Anwendungen die Absicht nicht erhalten. Die Lösung besteht darin, das Android:priority-Attribut im intent-filter-Tag zu erhöhen:

<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 die Aktivierung der SMS - Unterstützung in Hangouts 2.0 wird der BroadcastReceiver von SMS_RECEIVED in meiner App unterbrochen.

5
TheIT

intent.getAction().equals(SMS_RECEIVED)

Ich habe es erfolgreich ausprobiert.

3
Cathy

Ist heute über dieses Thema gestolpert. Wenn Sie heutzutage einen SMS -Empfänger codieren, verwenden Sie diesen Code anstelle des in OP veralteten Codes:

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

Ihr Broadcast-Empfänger muss Android:exported="true" angeben, um Broadcasts zu empfangen, die außerhalb Ihrer eigenen Anwendung erstellt wurden. Mein Rundfunkempfä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 angegeben, ist exported = "true" die Standardeinstellung. Sie können diese Zeile daher weglassen. Ich habe es so gelassen, dass die Diskussionskommentare Sinn machen.

2
Phil

Für Android 19+ können Sie es in Telephony.Sms.Intents.SMS_RECEIVED_ACTION) erhalten. Es gibt mehr in der Intents-Klasse, die einen Blick wert ist

1
peter

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

Das einfache SYntax von Code 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.
            }
        }
    }
}
1
Pradeep Sheoran

Ich habe kürzlich ein solches Problem festgestellt. Obwohl der Code korrekt war, habe ich die Berechtigungen in den App-Einstellungen nicht aktiviert. Daher wurden für Emulatoren nicht alle Berechtigungen standardmäßig festgelegt. Sie sollten es also selbst tun. 

1
Dracontis

Android.provider.telephony.SMS_RECEIVED ist nicht korrekt, da Telefonie eine Klasse ist und wie in Android.provider.Telephony.SMS_RECEIVED Großbuchstaben sein