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());
}
}
}
}
}
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!
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
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:
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
Cathy
intent.getAction().equals(SMS_RECEIVED)
Ich habe es erfolgreich ausprobiert.
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:
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.
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.
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.
}
}
}
}
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
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:
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)
anstattintent.getAction() == SMS_RECEIVED
– Peter Chaula
1. November 2016 um 15:54 Uhr