Bounty Nagroda - The Bounty otrzyma odpowiedź, że dostaje od zaludnionym wartości Telephony.Sms.Inbox.PERSON
, do powiązanej Contact
używając tylko ContractsContact
tabele.Telephony.Sms.Inbox.PERSON wykorzystuje przestarzałe Contacts.People._ID
Czytam wiadomości SMS w standardowy sposób w mojej aplikacji:
final String[] projection = {Telephony.Sms.Inbox.BODY,
Telephony.Sms.Inbox.ADDRESS,
Telephony.Sms.Inbox.READ,
Telephony.Sms.Inbox.DATE,
Telephony.Sms.Inbox.PERSON};
final Cursor cursor = ctx.getContentResolver().query(Telephony.Sms.Inbox.CONTENT_URI,
projection, null, null, Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);
Kiedy zaludnionych, id wrócił z indeksu Telephony.Sms.Inbox.PERSON
dotyczy id nieaktualnych Contacts.People._ID
i mogą być wykorzystane kwerendy dalszych informacji należy skontaktować się w następujący sposób:
final String[] projection = {Contacts.People.DISPLAY_NAME};
final String[] selectionArgs = {contactId};
final Cursor cursor = ctx.getContentResolver().query(Contacts.People.CONTENT_URI,
projection, Contacts.People._ID + " = ?", selectionArgs, null);
Dlaczego miałby ponownie W związku z tym nowe Telephony API użyć deprecated tables, zamiast ContactsContract?
Telephony.Sms.Inbox.PERSON dokumentacja stanowi:
Typ: INTEGER (odniesienie do elementu w treści: // Kontakty/osoby)
Próbowałem bezskutecznie (? Ale nie jest zaskoczeniem), aby znaleźć mapowanie do identyfikatora w dowolnym z pól identyfikatora ContactsContract
, dlatego muszę używać przestarzałych interfejsów API w celu rozwiązania zapytań, które muszę szybko wykonać.
Takie zapytania obejmują wyszukiwanie wiadomości przez konkretnego kontaktu, dla którego mam tylko nazwę. Styk może mieć kilka numerów, które nie mogą być w odpowiednim formacie do potencjalnie pasuje Telephony.Sms.Inbox.ADDRESS
wpisy .....
workaround korzystania Telephony.Sms.Inbox.ADDRESS
i ContactsContract.PhoneLookup nie jest koniec świata, gdy dzieje się od numeru do kontakt, ale wciąż czuję się . Muszę czegoś tu brakować?
Oto proces, którego używam, aby uzyskać wiadomości do "Joe Bloggs".
1) kwerendy tabeli ContactsContract
aby potwierdzić kontakt o imieniu Jan Kowalski istnieje na urządzeniu - lub uzyskać ścisłe dopasowanie jeśli kontakt jest faktycznie wymienione jako „Joe Blogi”.
2) Korzystanie z potwierdzoną imię, kwerendy przestarzałe Contact.People
stół, aby uzyskać wszystkie związane z nimi identyfikatory do kontaktu w następujący sposób:
final String selection = Contacts.People.DISPLAY_NAME + " LIKE ?";
final String[] projection = {Contacts.People.DISPLAY_NAME,
Contacts.People._ID};
final String[] selectionArgs = {contactName};
final Cursor cursor = ctx.getContentResolver().query(Contacts.People.CONTENT_URI,
projection, selection, selectionArgs, null);
3) przy użyciu listę nieaktualnych identyfikatorów stykowych, I kwerendy komunikat stół jak tak:
final String[] referredArgs = new String[contactIdArray.size()];
for (int i = 0; i < contactIdArray.size(); i++) {
referredArgs[i] = contactIdArray.get(i);
}
final String referredSelection = Telephony.Sms.Inbox.PERSON + " IN "
+ "(" + TextUtils.join(",", referredArgs) + ")";
final String[] projection = {Telephony.Sms.Inbox.BODY,
Telephony.Sms.Inbox.ADDRESS,
Telephony.Sms.Inbox.READ,
Telephony.Sms.Inbox.DATE,
Telephony.Sms.Inbox.PERSON};
final Cursor cursor = ctx.getContentResolver().query(Telephony.Sms.Inbox.CONTENT_URI,
projection, referredSelection, null, Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);
mam nadzieję, że ktoś powie mi, idę wokół domów tu i tam jest bardziej oczywiste rozwiązanie wykorzystujące aktualne API. Nie uważam iteracji całej tablicy wiadomości za pomocą zoptymalizowanego rozwiązania za pomocąContactsContract.PhoneLookup
.
Z góry dziękuję.
Pytanie brzmi, dlaczego zwrócona wartość 'PERSON' odnosi się do wycofanego identyfikatora' Contacts.People', zamiast używać wartości z tabel 'ContactsContract'. Zapytanie o tabelę wiadomości nie jest problemem. – brandall