1

アプリに MMS コンテンツ オブザーバーをセットアップしましたが、これは新しい MMS メッセージが到着するたびにトリガーされます。次に、「content://mms/inbox」にクエリを実行し、未読メッセージを取得します。問題は、MMS が部分的に到着することです (テキストと、オーディオ/写真/ビデオの添付ファイルが別々に到着します) または、少なくともコンテンツ オブザーバーが取得します(各 MMS パートがダウンロードされるたびに) 複数回トリガーされます. したがって、最初のパートが入ってくると、私のアプリはそれを検出しますが、実際には件名以外には何もありません. 数秒後、次のパートが入ってきます.私のアプリはそれを最初のものに追加します. したがって、3つ以上のパーツがある場合、ユーザーはさらにパーツが来るかどうかわからないため、これは厄介になります.

したがって、新しい MMS があることをユーザーに通知して表示する前に、すべての部品が到着するまで待ちたいと思います。ただし、コンテンツ プロバイダーには、多くの部分が合計で配信されると述べているものは見当たりません。不足しているものはありますか、または合計でいくつの部品があるかを判断する他の方法はありますか? (別の部分が入ったかどうかをチェックするランダムな間隔でwhileループを行うだけではありません)

4

1 に答える 1

0

やりたいことは、onChange 内の uri_idの最後の項目をチェックすることです。content://mms/inbox

cursor.moveToLast()以前の _id を保存し、をクエリした後、カーソルの最後の項目 ( ) の _id と比較する必要がありますcontent://mms/inbox。同じ場合_idは、前のメッセージを無視/破棄して、代わりにこのメッセージを保存することを選択できます。

cur最後のメッセージの ID を保存して、 inによって返されるメッセージの ID と比較できますonChange。ID が同じ場合は、メッセージを単に無視できます。

// might contain mistakes, but you'll get the idea:
protected void querySMS() {
    Cursor cur = getContentResolver().query(u, null, null, null, null);
    cur.moveToNext(); 
    if (lastId == cur.getLong(cur.getColumnIndex("_id")))
        return;
    lastId = cur.getLong(cur.getColumnIndex("_id"));
    ... //continue as it was
}
于 2013-08-24T11:21:35.647 に答える