2013-06-10 7 views
1

Недавно я работал над проектом Android, который требует, чтобы я получил текст и MMS. У меня нет большого опыта работы с Android, но я знаком с SQL и java, и я слежу за этими сообщениями как можно ближе.Второе последнее сообщение MMS, полученное вместо последнего в Android

Код, который я придумал в основном работает, но это, кажется, всегда взять текст из второго последнего сообщения MMS и не самая последняя. Любая идея, почему это будет происходить?

Вот соответствующие части класса MMSReceiver, которые я сделал с использованием двух потоков, упомянутых ранее в качестве руководства.

Во-первых, это OnReceive метод ... общественного класса MMSReceiver расширяет 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); 
    ... 

Метод getMessageText передается контекст и идентификатор сообщения и записывается как это ...

/* 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; 
} 

В этом методе вызывается getMmsText. Я понимаю, что этот процесс немного избыточен, но мне было трудно понять все, что происходит во время этого процесса, поэтому я сохранил его как похожее на исходные потоки, насколько мог, чтобы быть уверенным, что проблема не была в том, как я уменьшил его для своего собственного кода.

getMmsText выглядит следующим образом ...

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

Большое вам спасибо за вашу помощь и, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы, которые могут помочь с ответом.

ответ

1

Я сам, не выполнил весь процесс точно, но сейчас изучаю его, и это то, что я узнал до сих пор. Я помню, как читал перед этим прослушивание android.provider.Telephony.WAP_PUSH_RECEIVED будет уведомлять вас только о входящем MMS. Мое понимание состоит в том, что намерение - это скорее получение и на самом деле не означает, что MMS находится в телефоне еще, или, точнее, в базе данных, из которой можно извлечь. Это может объяснить, почему вы получаете только второе. Если вы хотите получить MMS, когда он будет готов и готов к вытаскиванию из базы данных, я думаю, вам понадобится ContentObserver, чтобы уведомить вас об обновлениях базы данных.

 Смежные вопросы

  • Нет связанных вопросов^_^