Большое Вам спасибо Ярослав, за то что вносите большой вклад в развитие Mobile Delphi. Очень мало примеров и документации (причем на любом языке) по этому поводу, ваш сайт очень выручает.
Я попробовал демку c:\Program Files (x86)\Embarcadero\Studio\18.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Address Book\Contacts\Contacts_Delphi.dproj с TAddressBook .
Delphi 10 upd 1
Запускал на телефоне HTC - ни один контакт не загрузился - просто пустой список.
UPD: Вместо AddressBook1.AllContacts(Source, Contacts);
Нужно AddressBook1.AllContacts(nil, Contacts); тогда загружает все контакты.
Вся проблема в том, что он считывает сразу все контакты. А мне это не нужно.
Лучше использовать код для поиска конкретного номера, прекрасно находит работает (также работает и вставка нового контакта, здесь описал http://stackoverflow.com/questions/29782398/insert-contacts-in-android-with-delphi/41294891#41294891):
function TCore.IsNumberInAddressBook(const aNumber: string): boolean;
var
vCursor: JCursor;
vQueryStr: string;
begin
Result := false;
// will be: data1 LIKE '%+380501960000%' (with quotes)
vQueryStr := JStringToString( TJCommonDataKinds_Phone.JavaClass.NORMALIZED_NUMBER) + ' LIKE ''%' + aNumber + '%''';
vCursor := TAndroidHelper.Activity.getContentResolver.query(
TJCommonDataKinds_Phone.JavaClass.CONTENT_URI,
nil, //projection String: A list of which columns to return. Passing null will return all columns, which is inefficient.
StringToJString(vQueryStr), // String: A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given URI.
nil, nil);
// Query help: https://developer.android.com/reference/android/content/ContentResolver.html#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)
if vCursor <> nil then
try
Result := vCursor.getCount > 0;
finally
vCursor.close;
end;
end;
// а это может пригодится
while (cursor.moveToNext) do
begin
lbContactsList.Text := JStringToString(cursor.getString(
cursor.getColumnIndex(StringToJString('DISPLAY_NAME'))));
lbContactsList.Tag := cursor.getInt(cursor.getColumnIndex(StringToJString('_ID')));
// ListBox1.AddObject(ListBoxItem);
end;
UPD: AllContacts находится в \source\fmx\FMX.AddressBook.Android.pas
А вообще для самообразования хотелось бы узнать как вызвать ContactsContract.PhoneLookup.CONTENT_FILTER_URI
И что это за конструкция такая Uri.withAppendedPath, ведь в будущем наверняка с ней придется сталкиваться. Если вы в курсе, расскажите пожалуйста.