Modo pratico per scoprire se l’SMS è stato inviato

Mi interessa come posso capire se l’SMS è stato inviato dal dispositivo.

Per avere la notifica SMS viene ricevuto, si usa una emittente:

android.provider.Telephony.SMS_RECEIVED

Importante ricordare che io non invio SMS dalla mia app, ho appena dovrebbe ascoltare quando gli SMS inviati dal dispositivo.

Forse dovrei ascoltare alcuni provider di Contenuti che in qualche modo correlati con SMS) e reagire per il cambiamento. Tutte le idee su come posso realizzare questo?

InformationsquelleAutor Jviaches | 2012-03-01

 

3 Replies
  1. 16

    Sì, è possibile ascoltare SMS ContentProvider utilizzando ContentObserver

    Qui è il mio esempio per SMS in Uscita:

    Registrare un ContetObserver con contenuto://sms/

       public class Smssendservice extends Service{
    
           @Override  
           public void onCreate() {
                SmsContent content = new SmsContent(new Handler());  
                //REGISTER ContetObserver 
                this.getContentResolver().
                    registerContentObserver(Uri.parse("content://sms/"), true, SMSObserver);  
           } 
    
           @Override
           public IBinder onBind(Intent arg0) {
                //TODO Auto-generated method stub
    
                return null;
           }

    SMSObserver.class

           public class SMSObserver extends ContentObserver {
                private Handler m_handler = null;
    
                public SMSObserver(SMSLogger handler){
                     super(handler);
                     m_handler = handler;
                }
    
                @Override
                public void onChange(boolean selfChange) {
                super.onChange(bSelfChange);
                Uri uriSMSURI = Uri.parse("content://sms");
    
                Cursor cur = this.getContentResolver().query(uriSMSURI, null, null,
                     null, null);
                cur.moveToNext();
    
                String protocol = cur.getString(cur.getColumnIndex("protocol"));
    
                if(protocol == null) {
             //the message is sent out just now     
                }               
                else {
                     //the message is received just now   
                }
          }
      }
    
    }
    • Sarebbe questo trigger se un SMS è stato rimosso così?
    • trigger quando l’SMS è stato rimosso dal ContentProvider
    • All’interno SMSObserver.class c’è Cursor cur = this.getContentResolver()...... A ciò relative getContentResolver() ? Perché eclipse mostra questo errore.
    • si prega di vedere il mio aggiornamento modifica.ho implementare il codice completo in un servizio.
    • Mentre questo è perfettamente funzionante, posso chiedere se l’utente invia un messaggio concatenato, saranno conteggiati come 1 o c’è qualche modo per verificare questo scenario?
    • u può dirmi non ho bisogno di usare il servizio voglio solo quando l’utente entra dentro la mia app mi mostra semplicemente il conteggio dei messaggi inviati all’utente ? come posso fare ?
    • Come si fa a posizionare il cursore sull’ultimo inviato, è anche arrivato molto messaggio? Vedo cur.moveToNext(), ma può essere un qualsiasi messaggio?
    • restituisce un cursore che indica l’ultima voce in URI
    • sì, è proprio su alcuni telefoni, che è necessario specificare l’ordine di default in modo esplicito e null non funziona.
    • ok. Io non sono consapevoli di questo. Può si danno alcuni esempi di tali dispositivi?
    • midhunhk IIRC qualcosa da LG. Non posso essere più specifico ora, i mesi sono passati da allora. Ma ho potuto trovare le righe di codice come: cur = context.getContentResolver().query(uri, cursorProjection, null, null, CallLog.Calls.DEFAULT_SORT_ORDER); ricordo che in una DEFAULT_SORT_ORDER ha risolto un bug, ed è stato copiato da altri query() chiamate solo in caso di necessità.
    • Grazie per l’aiuto. Ma nel mio caso, il protocollo non è mai null (è “0” in entrambi i casi). C’è qualche preferenza per l’utilizzo di Telephony.Sms.PROTOCOL con l’utilizzo di Telephony.Sms.TYPE e controllo se è MESSAGE_TYPE_INBOX o no?
    • Su Android API 16 ho testato questo pezzo di codice, e l’osservatore non è la notifica di una modifica del contenuto://sms, quindi il codice non è chiamato a tutti. Ho controllato il logcat console e scrivere che il contenuto://sms e contenuto://sms/in coda sono davvero aggiornato quando mando un SMS.. qualche idea ?
    • risolto o ancora di fronte al problema stesso
    • che cosa è SmsContent? non dovrebbe essere SMSObserver (classe definita subito dopo), invece?

  2. 7

    utilizzare il metodo seguente per inviare un sms, nonché verificare se l’sms consegnati o non.

    send.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    //TODO Auto-generated method stub
                    String phoneNo = "Phone number to sent";
                    String message = "Your message";
                    if (phoneNo.length() > 0 && message.length() > 0) {
                        TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                        int simState = telMgr.getSimState();
                        switch (simState) {
                        case TelephonyManager.SIM_STATE_ABSENT:
                            displayAlert();
                            break;
                        case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
                            //do something
                            break;
                        case TelephonyManager.SIM_STATE_PIN_REQUIRED:
                            //do something
                            break;
                        case TelephonyManager.SIM_STATE_PUK_REQUIRED:
                            //do something
                            break;
                        case TelephonyManager.SIM_STATE_READY:
                            //do something
                            sendSMS(phoneNo, message); //method to send message
                            break;
                        case TelephonyManager.SIM_STATE_UNKNOWN:
                            //do something
                            break;
                        }
    
                    } else {
                        Toast.makeText(getBaseContext(),
                                "Please enter both phone number and message.",
                                Toast.LENGTH_SHORT).show();
                    }
    
                }
    
                private void displayAlert() {
                    //TODO Auto-generated method stub
    
                    new AlertDialog.Builder(YourActivity.this)
                            .setMessage("Sim card not available")
                            .setCancelable(false)
                            //.setIcon(R.drawable.alert)
                            .setPositiveButton("ok",
                                    new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog,
                                                int id) {
                                            Log.d("I am inside ok", "ok");
                                            dialog.cancel();
                                        }
                                    })
    
                            .show();
    
                }
    
            });
    
    
    
    
                private void sendSMS(String phoneNumber, String message) {
            String SENT = "SMS_SENT";
            String DELIVERED = "SMS_DELIVERED";
    
            PendingIntent sentPI = PendingIntent.getBroadcast(YourActivity.this, 0,
                    new Intent(SENT), 0);
    
            PendingIntent deliveredPI = PendingIntent.getBroadcast(YourActivity.this,
                    0, new Intent(DELIVERED), 0);
    
            //---when the SMS has been sent---
            final String string = "deprecation";
            registerReceiver(new BroadcastReceiver() {
    
                @Override
                public void onReceive(Context arg0, Intent arg1) {
                    switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        Toast.makeText(YourActivity.this, "SMS sent",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.makeText(YourActivity.this, "Generic failure",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.makeText(YourActivity.this, "No service",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.makeText(YourActivity.this, "Null PDU",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.makeText(getBaseContext(), "Radio off",
                                Toast.LENGTH_SHORT).show();
                        break;
    
                    }
                }
            }, new IntentFilter(SENT));
    
            //---when the SMS has been delivered---
            registerReceiver(new BroadcastReceiver() {
                @Override
                public void onReceive(Context arg0, Intent arg1) {
                    switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        Toast.makeText(YourActivity.this, "SMS delivered",
                                Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        Toast.makeText(YourActivity.this, "SMS not delivered",
                                Toast.LENGTH_SHORT).show();
                        break;
                    }
                }
            }, new IntentFilter(DELIVERED));
    
            SmsManager sms = SmsManager.getDefault();
            sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    
        }
    • questo mi aiuta! grazie
    • Questo sta lavorando bene, Ma la domanda è: inviare sms dall’app predefinita
  3. 0

    Una cosa che mi viene in mente è che utilizza il logcat di registro. Ogni volta che un SMS inviati/ricevuti c’è una voce specifica. Basta collegare il telefono in debug e test e si potrà osservare la specifica voce.

    Dovrei parlare di questo metodo è fatto dall’app, in modo da poter lavorare in codice.

    Prendere un tiro di questo. Ci possono essere altri metodi, ma che sembra abbastanza facile e in grado di do -.

    • Non aiuta molto.

Lascia un commento