2010-04-06 7 views
11

J'inscris actuellement un observateur de contenu sur l'URI "content: // sms /" pour écouter les messages entrants et sortants envoyés.Android - Interrogation du SMS ContentProvider?

Cela semble fonctionner ok et j'ai aussi essayé de supprimer de la base de données SMS, mais je ne peux supprimer un fil de discussion de l'URI suivant « contenu: // sms/conversations/»

Voici le code I utiliser pour cette

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

} 


} 

Cependant, je veux être en mesure d'obtenir le recipricant et le texte du message du contenu fournisseur SMS, quelqu'un peut-il me dire comment faire?

Et aussi comment supprimer un message au lieu d'un thread entier?

+0

J'ai fait quelques progrès sur ce dans 1.5 mais je l'ai couru sur 1.6 et mon observateur de contenu cesse de fonctionner, dans 1.5 sa configuration pour "content: // sms /" mais devrait-il être quelque chose de différent pour 1.6? –

+0

Un bon article sur les méthodes de messagerie SMS Android: http: //mobdev.olin.edu/mobdevwiki/FrontPage/Didacticiels/SMS% 20Messaging –

+0

Bonjour Donal, J'ai vu votre question lors de la recherche d'une solution à mon problème. En fait, je veux savoir sur le code que vous avez posté avant la déclaration de classe. Ces codes appartiennent à une classe externe ou quoi? Au fait, si vous avez résolu votre problème, alors pouvez-vous me guider un peu. J'utilise Android 2.2 et mon problème est assez similaire à la vôtre. –

Répondre

10

Cela a déjà été discuté.

Pour lire les SMS à partir du contrôle du fournisseur de contenu: - android-1-5-reading-sms-messages

Vérifiez ce fils:

Abo ut votre commentaire en disant que vous supprimez un fil entier au lieu d'un seul sms: Avez-vous essayé this code?

+0

Merci, mais ces discussions traitent seulement de la suppression d'un SMS qui n'est qu'une partie de ma question et non de la partie principale, mais elles ne traitent pas spécifiquement de la suppression d'un seul message mais de ce que j'ai déjà posté dans mon code. Est-ce qu'ils suppriment un fil de conversation entier et pas un seul message dans un fil de l'Uri "content: // sms/outbox /". Comme dans ma question ma priorité est de savoir comment récupérer le texte du message et le destinataire du fournisseur de contenu SMS –

+1

@Donal: Je viens d'éditer ma réponse. – Macarse

+0

Merci Macarse, quelques extraits intéressants de lecture et de code là –

4

La colonne d'adresse contient le numéro de téléphone de l'expéditeur de SMS.

Utilisez cursor.getString (cursor.getColumnIndex ("adresse")) pour extraire le numéro de téléphone sous forme de chaîne. Placez un curseur sur le contenu: // sms et triez-le en ordre décroissant de date pour obtenir le message le plus récent. Vous devrez attendre que le nouveau message entre dans la table sinon vous tirerez des informations du mauvais message. Dans un broadcastReceiver incomingSMS, utilisez une boucle while dans un thread pour interroger cursor.getCount() pour changer. Ensuite, après la boucle while, cursor.moveToFirst sera le nouveau message.

Par exemple:

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

ensuite obtenir l'adresse de l'expéditeur sms:

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

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

Cette boucle while se met en pause le fil jusqu'à ce que le nouveau message arrive. Vous pouvez également utiliser un contentObserver, mais cette boucle while est simple et ne nécessite pas d'enregistrement, de désinscription et de classe séparée. Franchement, je pense qu'il est plus rapide de tirer l'adresse et le corps du message directement à partir de la pdu de l'intention entrante. De cette façon, vous n'avez pas à attendre que le message entre dans la table pour obtenir l'adresse et le corps. La classe Android SmsMessage a une variété de méthodes utiles.