Domanda

Io attualmente registrare un osservatore di contenuti sul seguente URI "contenuto: // sms /". Per ascoltare fuori per i messaggi in entrata e in uscita vengono inviati

Questo sembra funzionare bene e ho anche provato a cancellare dal database di SMS ma posso eliminare solo un intero thread dal seguente URI "contenuto: // sms / conversazioni /"

Qui è l'uso di codice I per che

String url = "content://sms/"; 
        Uri uri = Uri.parse(url); 
        getContentResolver().registerContentObserver(uri, true, new MyContentObserver(handler));                    

}

class MyContentObserver extends ContentObserver { 

    public MyContentObserver(Handler handler) { 

        super(handler); 

    }

@Override public boolean deliverSelfNotifications() { 
    return false; 
    }

@Override public void onChange(boolean arg0) { 
    super.onChange(arg0);

     Log.v("SMS", "Notification on SMS observer"); 

    Message msg = new Message(); 
    msg.obj = "xxxxxxxxxx";

    handler.sendMessage(msg);

    Uri uriSMSURI = Uri.parse("content://sms/");
    Cursor cur = getContentResolver().query(uriSMSURI, null, null,
                 null, null);
    cur.moveToNext();
    String protocol = cur.getString(cur.getColumnIndex("protocol"));
    if(protocol == null){
           Log.d("SMS", "SMS SEND"); 
           int threadId = cur.getInt(cur.getColumnIndex("thread_id"));

           Log.d("SMS", "SMS SEND ID = " + threadId); 
           Cursor c = getContentResolver().query(Uri.parse("content://sms/outbox/" + threadId), null, null,
                   null, null);
           c.moveToNext();
           int p = cur.getInt(cur.getColumnIndex("person"));
           Log.d("SMS", "SMS SEND person= " + p); 
           //getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadId), null, null);

    }
    else{
        Log.d("SMS", "SMS RECIEVE");  
         int threadIdIn = cur.getInt(cur.getColumnIndex("thread_id"));

         getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadIdIn), null, null);
    }

 }


} 

Comunque voglio essere in grado di ottenere il recipricant e il testo del messaggio dal provider SMS contenuti, qualcuno può dirmi come fare questo?

E anche il modo di eliminare uno messaggio invece di un intero thread?

È stato utile?

Soluzione

Questo è stato già discusso.

Per leggere SMS dal controllo fornitore di contenuti:  - android-1-5-lettura-SMS-messaggi

Controlla questo thread:

A proposito di tuo commento dicendo che si sta eliminando un intero filo invece di un singolo sms: Hai provato questo codice ?

Altri suggerimenti

La colonna indirizzo contiene il numero di telefono del mittente sms.

Usa cursor.getString (cursor.getColumnIndex ( "indirizzo")) per tirare il numero di telefono come una stringa. Pop un cursore sui contenuti: // sms e ordinare in ordine decrescente data per ottenere il messaggio più recente. Si dovrà attendere il nuovo messaggio di entrare nel tavolo altrimenti si estrarre informazioni dal messaggio sbagliato. In un incomingSMS broadcastReceiver utilizzare un ciclo while, in un thread, polling per la cursor.getCount () per cambiare. Poi, dopo il ciclo while cursor.moveToFirst sarà il nuovo messaggio.

Ad esempio:

Cursor cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, null);
int count = cur.getCount();
while (cur.getCount() == count)
{
     Thread.sleep(1000);
     cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, null);
}

Quindi ottenere l'indirizzo del mittente sms:

cur = getContentResolver().query(Uri.parseUri(content://sms), null, null, null, "date DESC");

cur.MoveToFirst();
String telephoneNumber = cur.getString(cur.getColumnIndex("address");

Questo ciclo while si metterà in pausa il filo fino a quando il nuovo messaggio arriva. È inoltre possibile utilizzare un contentObserver, ma questo ciclo while è semplice e non richiede registrazione, annullamento della registrazione, e una classe separata.

Francamente penso che il suo più veloce per tirare l'indirizzo e il corpo del messaggio direttamente dalla PDU dell'intento in entrata. In questo modo non dovete attendere che il messaggio di entrare nel tavolo per ottenere l'indirizzo e il corpo. La classe smsmessage Android ha una varietà di metodi utili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top