【发布时间】:2023-03-14 22:10:02
【问题描述】:
如何在 Android 服务(Delphi + Firemonkey)中通过电话号码查找联系人姓名?
德尔福东京 + Firemonkey (FMX)。
我不明白,为什么 wSubCursor.getCount 返回 0?
通讯录中的电话号码准确无误。
函数在服务内部执行。
function GetContactByPhoneNumber(const sTel: string): string;
var
wJDislpayName,
wJFirstName,
wJLastName,
wJQueryStr: JString;
wJQueryParams: TJavaObjectArray<JString>;
wSubCursor: JCursor;
wfilter: TJavaObjectArray<JString>;
wDataUri: JNet_URI;
begin
wDataUri := TJContactsContract_Data.JavaClass.CONTENT_URI;
wfilter := TJavaObjectArray<JString>.Create(3);
wfilter[0] := TJCommonDataKinds_StructuredName.JavaClass.DISPLAY_NAME;
wfilter[1] := TJCommonDataKinds_StructuredName.JavaClass.FAMILY_NAME;
wfilter[2] := TJCommonDataKinds_StructuredName.JavaClass.GIVEN_NAME;
wJQueryStr := StringToJString('mimetype = ? AND lookup = ?');
wJQueryParams := TJavaObjectArray<JString>.Create(2);
wJQueryParams[0] := TJCommonDataKinds_Phone.JavaClass.NUMBER;
wJQueryParams[1] := StringToJString(sTel);
wSubCursor := TAndroidHelper.Context.getContentResolver.Query(wDataUri, wfilter, wJQueryStr, wJQueryParams, nil);
try
if wSubCursor.getCount > 0 then
begin
// Getting only first row, as we retrieving only names, a contact can have only one first name, one familyname,
// for phone number for example, we need to loop on each row (while (wSubCursor.moveToNext) do) because a contact can have many phone number
wSubCursor.moveToNext;
wJDislpayName := wSubCursor.getString(0);
wJLastName := wSubCursor.getString(1);
wJFirstName := wSubCursor.getString(2);
end;
Result := JStringToString(wJDislpayName);
finally
wSubCursor.close;
FreeAndNil(wSubCursor);// := nil;
end;
end;
感谢
【问题讨论】:
标签: android delphi service firemonkey contacts