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.