1

最近,我一直在做一个 Android 项目,需要我从 MMS 中获取文本。我对 Android 没有太多经验,但我熟悉 SQL 和 java,并且我一直在尽可能密切地关注这些帖子。

我想出的代码大部分都有效,但它似乎总是从第二条最近的 MMS 消息中获取文本,而不是最近的一条。知道为什么会发生这种情况吗?

以下是我使用前面提到的两个线程作为指南制作的 MMSReceiver 类的相关部分。

首先是onReceive方法... public class MMSReceiver extends 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 方法传递上下文和消息 id,并写成这样......

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

非常感谢您的帮助,如果您有任何问题可以帮助您回答,请告诉我。

4

1 回答 1

1

我自己并没有完全完成整个过程,但目前正在研究它,这是我迄今为止所学到的。我记得之前读过,监听 android.provider.Telephony.WAP_PUSH_RECEIVED 只会通知你收到的彩信。我的理解是,意图更多的是收据,实际上并不意味着彩信已经在手机中,或者更准确地说,是在要从中提取的数据库中。这可以解释为什么你只得到倒数第二个。如果您想在完成并准备好从数据库中提取 MMS 时获取它,我认为您需要一个 ContentObserver 来通知您数据库更新。

于 2013-12-15T02:51:22.987 回答