2013-06-10 1 views
1

Récemment, j'ai travaillé sur un projet Android qui me demande d'obtenir le texte et MMS. Je n'ai pas beaucoup d'expérience avec Android, mais je suis familier avec SQL et Java et j'ai suivi ces messages aussi étroitement que possible.Deuxième MMS reçu le plus récent au lieu du plus récent dans Android

Le code que je suis venu avec des œuvres la plupart du temps, mais il semble toujours saisir le texte de la deuxième plus récent message MMS et non le plus récent. Une idée de pourquoi cela se passerait-il?

Voici les parties pertinentes de la classe MMSReceiver que j'ai faite en utilisant les deux threads mentionnés précédemment comme guide.

D'abord, la méthode est OnReceive ... public class MMSReceiver étend BroadcastReceiver {

private static final String ACTION_MMS_RECEIVED = "android.provider.Telephony.WAP_PUSH_RECEIVED"; 
private static final String MMS_DATA_TYPE = "application/vnd.wap.mms-message"; 
private static String message; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.d("Test" , "MMSReceiver!"); 
    Uri uri = Uri.parse("content://mms-sms/conversations");  
    String action = intent.getAction(); 
    String type = intent.getType(); 
    //Log.d("MMS", "action is " + action + " , type is " + type); 
    final Context cont = context; 
    ContentResolver cr = context.getContentResolver(); 
    final String[] projection = new String[]{"*"}; 
    Uri MMSuri = Uri.parse("content://mms/inbox/"); 
    Cursor MmsIDquery = cr.query(uri, projection, null, null, null); 
    MmsIDquery.moveToFirst(); 
    String mid = MmsIDquery.getString(MmsIDquery.getColumnIndex("_id")); 
    Log.d("MMS", "message id for unreadable message is " + mid); 
    message = getMessageText(cont, mid); 
    ... 

La méthode getMessageText est passé le contexte et l'identifiant de message et est écrit comme ceci ...

/* gets message text */ 
public String getMessageText(Context context, String mmsid){ 
    Log.d("MMS", "mmsid was " + mmsid); 
    String message = null; 
    String mid = ""+(Integer.parseInt(mmsid)+2); 
    Log.d("MMS", "mmsid is now " + mid); 
    String selectionPart = "mid=" + mmsid; 
    Uri mmsTextUri = Uri.parse("content://mms/part"); 
    Cursor cursor = context.getContentResolver().query(mmsTextUri, null, selectionPart, null, null); 
    if (cursor.moveToFirst()){ 
     do{ 
      String partId = cursor.getString(cursor.getColumnIndex("_id")); 
      String type = cursor.getString(cursor.getColumnIndex("ct")); 
      Log.d("MMS", "getMessageText was called, partId = " + partId + " , type = " + type); 
      if ("text/plain".equals(type)){ 
       String data = cursor.getString(cursor.getColumnIndex("_data")); 
       Log.d("MMS", "data was " + data); 
       if (data != null){ 
        message = getMmsText(context, partId); 
        Log.d("MMS", "body was " + message); 
       } else { 
        message = cursor.getString(cursor.getColumnIndex("text")); 
        Log.d("MMS", "body was " + message); 
       } 
      } 
     } while (cursor.moveToNext()); 
    } else { 
     Log.d("MMS", "Query returned nothing in getMessageText()"); 
    } 
    return message; 
} 

Dans cette méthode, getMmsText est appelé. Je me rends compte que ce processus est un peu redondant, mais j'avais du mal à comprendre tout ce qui se passait au cours de ce processus, donc je l'ai gardé comme les fils d'origine que je pouvais pour être sûr que le problème n'était pas de la façon dont je l'ai réduit pour mon propre code.

getMmsText ressemble à ceci ...

public String getMmsText(Context c, String id){ 
    Log.d("MMS", "getMmsText was called with " + id); 
    Uri partUri = Uri.parse("content://mms/inbox/" + id); 
    InputStream is = null; 
    StringBuilder sb = new StringBuilder(); 
    try{ 
     is = c.getContentResolver().openInputStream(partUri); 
     if (is != null){ 
      InputStreamReader isr = new InputStreamReader(is, "UTF-8"); 
      BufferedReader reader = new BufferedReader(isr); 
      String temp = reader.readLine(); 
      while(temp != null){ 
       sb.append(temp); 
       temp = reader.readLine(); 
      } 
     } 
    } catch (IOException e){} 
    finally { 
     if (is != null){ 
      try{ 
       is.close(); 
      } catch (IOException e){} 
     } 
    } 
    return sb.toString(); 
} 

Merci beaucoup pour votre aide et s'il vous plaît laissez-moi savoir si vous avez des questions qui peuvent aider à votre réponse.

Répondre

1

Je n'ai pas fait tout le processus exactement mais je suis actuellement en train de faire des recherches et c'est ce que j'ai appris jusqu'ici. Je me souviens avoir lu avant d'écouter android.provider.Telephony.WAP_PUSH_RECEIVED ne vous informera que d'un MMS entrant. Ma compréhension est que l'intention est plus d'un reçu et ne signifie pas réellement le MMS est encore dans le téléphone, ou plus précisément, dans la base de données à tirer. Cela peut expliquer pourquoi vous obtenez seulement l'avant-dernier. Si vous voulez obtenir le MMS quand il est terminé et prêt à être retiré de la base de données, je pense que vous aurez besoin d'un ContentObserver pour vous informer des mises à jour de la base de données.

Questions connexes