2

私はAndroid開発の初心者です。電話のテキストメッセージを読むための簡単なアプリケーションを実行しています。コンテンツ プロバイダーの content://sms に関する問題がいくつあるかは知っていますが、カスタム プロバイダーを作成するのは難しすぎるので、とりあえずそれを使用します。

問題: content://sms/inbox を照会すると、すべてのメッセージが取得されるため、それらを ListActivity にリストしようとすると、メッセージごとに同じ連絡先が繰り返されます。基本的にこれは正しいです。理解していますが、「より専門的な」何か他のものが必要です。まず第一に: 1- 携帯電話では非常に大きなクエリに時間がかかります。 2- 明らかに、すべてのメッセージをこのようにリストしても意味がありません。

最も単純なことは、DISTINCT を使用するか、そうでない場合は、すべてのメッセージ、GROUP BY を再度クエリするため、非常に悪いことです。問題は、GROUP BY が認識されないことです。正しくは、コンテンツ プロバイダーの背後にあるものは、DB とは異なる可能性があるためです。どうやら DISTINCT は受け入れられますが、使用しても違いはありません。メッセージのクエリを取得した後、メッセージを自分でフィルタリングせずに解決策を見つけるために、3日間おかしくなりました。

これは、クエリを実行しようとするコードの小さくて単純な部分です。 List smsList = new ArrayList();

       Uri uri = Uri.parse("content://sms/inbox");
       String order = new String("date DESC");
       String[] projection = new String[]{"DISTINCT thread_id, address, body, _id"};
       String selection = new String("GROUP BY address"); //this doesn't work
       Cursor c = getContentResolver().query(uri, projection, null, null, order);

       // Read the sms data and store it in the list
       if(c.moveToFirst()) {
           for( i=0; i < c.getCount(); i++) {
               SMSData sms = new SMSData();
               sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
               sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString());
               sms.setId(c.getString(c.getColumnIndexOrThrow("_id")).toString());
               sms.setPersonName(getContactNameFromNumber(sms.getNumber()));
               smsList.add(sms);
               //Log.v(TAG,"il nome è: "+smsList.get(i).getPersonName()+" e il numero è: "+smsList.get(i).getNumber());
               c.moveToNext();
           }
       }

       c.close();

誰かが私を助けてくれることを願っています!前もって感謝します。

4

1 に答える 1

0

を使用する必要がありますGROUP BY thread_id。詳細については、私の github リポジトリSmsMessengerを参照してください。次のクエリで取得できます。

    cursor = MyApplication.getContext().getContentResolver().query(Uri.parse("content://sms")
            , null
            , "address IS NOT NULL) GROUP BY (thread_id"
            , null
            , null);
于 2016-11-30T15:55:37.727 に答える