2010-04-06 28 views
11

Actualmente registro un observador de contenido en el siguiente URI "contenido: // sms /" para escuchar los mensajes entrantes y salientes que se envían.Android - ¿Cómo consultar el proveedor de contenido SMS?

Esto parece funcionar bien y también me han tratado de eliminar de la base de datos de SMS, pero sólo se puede eliminar un tema entero de la siguiente URI "contenido: // SMS/conversaciones /"

Aquí está el código que utilizar para ese

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

} 


} 

Sin embargo, quiero ser capaz de obtener la recipricant y el texto del mensaje del proveedor de contenido de SMS, puede alguien decirme cómo hacer esto?

¿Y también cómo eliminar un mensaje en lugar de un hilo completo?

+0

He estado progresando en esto en 1.5 pero lo ejecuté en 1.6 y mi observador de contenido deja de funcionar, en 1.5 está configurado para "content: // sms /" pero debería ser algo diferente para 1.6? –

+0

Un buen artículo sobre los métodos de mensajería SMS de Android: http: //mobdev.olin.edu/mobdevwiki/FrontPage/Tutorials/SMS% 20Messaging –

+0

Hola Donal, he visto tu pregunta mientras buscaba una solución para mi problema. En realidad, quiero saber sobre el código que ha publicado antes de la declaración de la clase. Esos códigos pertenecen a una clase externa o qué? Por cierto, si resolvió su problema, ¿puede guiarme un poco? Estoy usando Android 2.2 y mi problema es bastante similar al tuyo. –

Respuesta

10

Esto ya fue discutido.

Para leer SMS desde el cheque proveedor de contenido: - android-1-5-reading-sms-messages

marca esta hilos:

Abo Escribe tu comentario diciendo que estás borrando un hilo completo en lugar de un solo sms: ¿Has probado this code?

+0

Gracias pero esos hilos solo se ocupan de la eliminación de un SMS que es solo parte de mi pregunta y no la parte principal, además no se ocupan específicamente de borrar un solo mensaje sino que hacen lo que ya he publicado en mi código anterior, que es que eliminan un hilo de conversación completo y no un solo mensaje dentro de un hilo de Uri "content: // sms/outbox /". Como en mi pregunta, mi prioridad es averiguar cómo recuperar el mensaje de texto y el receptor del proveedor de contenido de SMS –

+1

@Donal: Acabo de editar mi respuesta. – Macarse

+0

Gracias Macarse, algunos fragmentos de código y lectura interesantes hay –

4

La columna de dirección contiene el número de teléfono del remitente de sms.

Utilice cursor.getString (cursor.getColumnIndex ("dirección")) para extraer el número de teléfono como una Cadena. Haga clic en un cursor sobre el contenido: // sms y ordene la fecha en orden descendente para obtener el mensaje más reciente. Tendrá que esperar que ingrese el nuevo mensaje en la tabla; de lo contrario, obtendrá información del mensaje incorrecto. En un broadcastSMS broadcastReceiver usa un ciclo while, en un hilo, sondeo para que cursor.getCount() cambie. Luego, después del ciclo while cursor.moveToFirst será el nuevo mensaje.

Por ejemplo:

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

a continuación, obtener la dirección del remitente SMS:

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

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

esto mientras se detendrá el hilo hasta que llegue el nuevo mensaje. También puede usar un servidor de contenido, pero este ciclo while es simple y no requiere registro, anulación de registro y una clase separada.

Francamente, creo que es más rápido extraer la dirección y el cuerpo del mensaje directamente del PDU del intento entrante. De esta forma, no tiene que esperar que el mensaje ingrese a la tabla para obtener la dirección y el cuerpo. La clase de Android SmsMessage tiene una variedad de métodos útiles.

Cuestiones relacionadas