2

3 つの未読 SMS メッセージがネイティブ (電話) に存在し、ユーザーが SMS の 1 つを読んだ場合。アプリケーションで (ネイティブから) 読み取られた SMS を識別する方法。

現在、私は ContentObserver を使用しており、ユーザーがネイティブ (電話) から SMS を読み取るときに onChange() メソッドが呼び出されます。

すべての未読 SMS メッセージを取得できます。

Cursor cursor = this.getContentResolver().query(Uri.parse("content://sms/"), null, "read = 0", null, null);

どの SMS がネイティブ (電話) から読み取られたかを識別する方法。ヘルプやガイダンスをいただければ幸いです。

Nexus 4(Android 4.3) - API 18) では、Android ネイティブ Sms クライアントで 2 つの未読 SMS (2 つの異なる送信者に属する) の通知 (デバイス ステータス バー内) がある場合、ユーザーがその通知をクリックすると、onChange(context, uri) が呼び出されます。私のアプリケーションでは、その中で読み取りSMSのIDを取得しようとしました:

String id = uri.getLastPathSegment();

上記の場合、「id」の値として「inbox」が来ました。ただし、Android ネイティブ Sms クライアントからユーザーが SMS を読み取る場合、onChange(context, uri) メソッドは呼び出されません。

Samsung Galaxy S3 (Android 4.1.2 - API 16) では、onChange(context, uri) はどちらの場合でもまったく呼び出されません (つまり、ユーザーがネイティブから SMS を読んだり、ユーザーが通知をクリックした場合 (デバイスのステータスバーで) ) Android ネイティブ Sms クライアントでの 2 つの未読 SMS (2 つの異なる送信者に属する)。

(API 16 では、新しい SMS がネイティブで受信されると、onChange(context, uri) が呼び出され、「id」の値はその SMS の一意の ID と同じです - Nexus 4(Android 4.3) でテスト済み)

注: ここで、「ネイティブから」とは、「デバイスの既定の SMS クライアントから」を意味します。

4

1 に答える 1

3

どのメッセージが未読から既読に変化したかを明確に判断するには、独自のデータ構造内のすべての未読メッセージの状態を追跡し、Content Observer によって検出された onChange ごとに比較して、どのメッセージが既読状態に変化したかを判断する必要があります。コンテンツ リゾルバー クエリにプロジェクションと選択の引数を追加して、データ セットを対象のフィールドのみに絞り込むことで、パフォーマンスを向上できる場合があります。

願わくば、Google が Android 4.4 で約束している SMS API の今後の変更により、この種の目的で隠し API とコンテンツ プロバイダーを使用する必要がなくなります。

また、ネイティブ メッセージング アプリで使用されるcom.android.mms.data.Conversationクラスによって生成される markAsRead デバッグ メッセージを探すことで、読み取られた SMS (または少なくともスレッド) を特定できる場合があります。

D/Mms (1645): [192] markAsRead: update read/seen for thread uri: content://mms-sms/conversations/4

ただし、これは常に信頼できるとは限らず、API レベル 16 の READ_LOGS パーミッションに課せられた制限により、アプリがシステム権限を持っていない限り、Android 4.1 以降のデバイスでは機能しません。

于 2013-10-18T01:35:42.333 に答える