android - pour - sms web




Android-Récepteur de diffusion SMS (7)

J'ai essayé votre code et j'ai trouvé que ça ne fonctionnait pas.

Je devais changer

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

à

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

Maintenant ça marche. C'est juste un problème avec java qui vérifie l'égalité.

J'ai essayé d'obtenir this programme pour fonctionner mais jusqu'ici n'ayant aucune chance. Je ne peux pas trouver où je me trompe. Je ne suis pas sûr si quelque chose ne va pas avec le code, ou le débogage.

J'essaie d'être averti si un nouveau SMS arrive.

Voici mon programme:

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

Et le fichier manifeste:

<?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> 

J'envoie des SMS via Telnet, et je ne peux voir aucun message reçu dans le logcat. Voici mon logcat du moment de l'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

Ainsi, le SMS semble être reçu par l'émulateur, mais il semble que les intentions ne soient pas déclenchées. Qu'est-ce que je fais mal ici? Après l'installation, dois-je en quelque sorte «démarrer» ce récepteur? Parce que quand j'installe, je reçois

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

Donc je me demande si quelque chose ne va pas ici.


Le code mis à jour est:

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

Le code le plus ancien était:

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

Le SYntax simple du code est:

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.
            }
        }
    }
}

Pour Android 19+, vous pouvez l'obtenir dans Telephony.Sms.Intents.SMS_RECEIVED_ACTION) . Il y a plus dans la classe Intent que ça vaut la peine de regarder


Trébuché à travers cela aujourd'hui. Pour tous ceux qui codent un récepteur SMS aujourd'hui, utilisez ce code à la place de l'obsolète dans OP:

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

une chose importante qui devrait être mentionné avec ce fil est la description aboud pdu
Une PDU est une "unité de discription de protocole" , qui est le format de l'industrie pour un message SMS. parce que SMSMessage les lit / écrit, vous ne devriez pas avoir besoin de les disséquer.
Un message volumineux peut être divisé en plusieurs, c'est pourquoi il s'agit d'un tableau d'objets.


android.provider.Telephony.SMS_RECEIVED a un T majuscule, et le tien dans le manifeste ne l'est pas.

Veuillez garder à l'esprit que cette action d' Intent n'est pas documentée.


intent.getAction().equals(SMS_RECEIVED)

Je l'ai essayé avec succès.







broadcastreceiver