1

最近、私は MMS からテキストを取得する必要がある Android プロジェクトに取り組んでいます。私は Android の経験はあまりありませんが、SQL と Java には精通しており、これらの投稿をできる限り詳しくフォローしています。

私が思いついたコードはほとんど動作しますが、常に最新のメッセージではなく、2 番目に新しい MMS メッセージからテキストを取得しているようです。なぜこれが起こっているのでしょうか?

上記の 2 つのスレッドをガイドとして使用して作成した 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 のみが通知されることを前に読んだことを思い出します。私の理解では、意図は領収書のようなものであり、実際には MMS がまだ電話にあるという意味ではなく、より正確にはデータベースから取得するという意味でもありません。それが、最後から2番目しか得られない理由を説明するかもしれません。MMS が完成してデータベースから取得する準備ができたときに MMS を取得したい場合は、データベースの更新を通知する ContentObserver が必要になると思います。

于 2013-12-15T02:51:22.987 に答える