2013-08-05 3 views
0

Je crée une application qui détectera quand un message mms est envoyé ou reçu et capturera le contenu. Je le fais en utilisant un contentResolver pour "content: // mms-sms/conversations". Quand cela est déclenché, je parcourt les conversations pour trouver le dernier (juste envoyé). Parce que "content: // mms-sms/conversations" ne fonctionnait pas lorsque je posais mon curseur sur tous les appareils, j'utilise "content: // mms-sms/conversations? Simple = true". Je itère, trouve la première conversation dans la liste (la liste est ordonnée par date desc), puis passe le _id pour obtenir le contenu réel, en utilisant contentResolver.query (uri, Uri.Parse ("content: // mms/part" , selectionPart, null, null); Cependant, lorsque j'essaie d'itérer en utilisant ce curseur, aucun enregistrement n'est trouvé pour l'identifiant de la conversation, j'essaye simplement de détecter quand un mms est envoyé ou reçu et d'obtenir l'information dessus. avons vu de nombreux sujets sur cela, mais rien n'a semblé résoudre le problème. des idées? MerciProblèmes avec mms capturant dans android en utilisant contentResolver

public void getMMS(Context context) 
{ 
    SentinelService.grabbingMMS = false; 

    boolean sent, startup; 
    final String[] projection = new String[] { "*" }; 

    Uri uri = Uri.parse("content://mms-sms/conversations?simple=true"); 
    Cursor cursor = contentResolver.query(uri, null, null, null, "_date DESC"); 

    if (cursor.moveToFirst()) { 
    do 
    { 
    String id = cursor.getString(cursor.getColumnIndex("_id")); 
    String d = cursor.getString(cursor.getColumnIndex("date")); 

     MMSLog mmsLog = buildMMSLog(id, sent); 
    } while (cursor.moveToNext()); 
} 



private MMSLog buildMMSLog(String mmsID, boolean sent) 
{ 

String body = "", partID = "", imageString = null, type = "", tempType = "",  selectionPart = "mid=" + mmsID; 
    Bitmap bitmap = null; 
    Uri uri = Uri.parse(MMS_PART); 
    Cursor cursor = contentResolver.query(uri, null, selectionPart, null, 
      null); 

    if (!cursor.isAfterLast()) { 

     String[] s = cursor.getColumnNames(); 

     partID = cursor.getString(cursor.getColumnIndex("_id")); 
     tempType = cursor.getString(cursor.getColumnIndex("ct")); 

     if ("text/plain".equals(tempType)) { 
      String data = cursor.getString(cursor.getColumnIndex("_data")); 
      if (data != null) { 
       body = getMMSText(partID); 
      } else { 
       body = cursor.getString(cursor.getColumnIndex("text")); 
      } 
     } else if ("image/jpg".equals(tempType) 
       || "image/gif".equals(tempType) 
       || "image/jpeg".equals(tempType) 
       || "image/bmp".equals(tempType) 
       || "image/png".equals(tempType)) { 
      bitmap = getMMSImage(partID); 
      type = tempType; 
     } 

    } 

    try { 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(CompressFormat.JPEG, 50, stream); 
     bitmap.recycle(); 
     byte[] byteArray = stream.toByteArray(); 
     stream = new ByteArrayOutputStream(); 
     imageString = new String(Base64.encodeBase64(byteArray)); 
    } 

    catch (Exception ex) { 
    } 

    return new MMSLog(getAddressNumber(mmsID, sent), body, imageString, 
      type, sent); 
} 

Répondre

0

ne me citez pas sur cela, mais je pense que le _id qui est retourné est le thread_id de la requête de conversations. Qu'est-ce que J'ai eu du succès avec (pour MMS) l'identifiant de la transaction qui devrait être disponible sous la forme tr_id

Il peut y avoir d'autres solutions, mais avec le tr_id, vous pouvez interroger le contenu: // mms/ avec ce tr_id, extraire l'identifiant de la pièce (_id) et interroger "content: // mms/part" + _id.

Dans votre requête de la table de pièces mms gardez à l'esprit qu'il peut y avoir plusieurs enregistrements retournés de sorte que vous devez parcourir tout le contenu de la partie curseur en vérifiant les types pour l'enregistrement que vous voulez.

Questions connexes