Android 我怎样才能得到一部电话';Firemonkey移动应用程序中的联系人列表?
如何在FireMonkey移动应用程序中获取手机的联系人列表?考虑到Delphi没有为该问题提供统一/包装的解决方案,您可以使用与使用本机编程API的程序员大致相同的方法来获取联系人列表 您需要研究Android SDK如何显示联系人列表以及iOS SDK如何显示联系人列表,然后使用本机API访问它 这两种平台之间的差异很大,但一旦您在两种不同的操作系统上建立了实现,并了解了这两种实现提供的内容和可访问的内容,就可以编写一些与操作系统无关的接口。这就是FMX在两个平台上实现的类似功能的其他实例中所做的 如果所需的API尚未导入到Delphi的RTL中(这是很有可能的),那么您还需要为所需的API编写导入,以便能够首先调用它们 执行摘要:Android 我怎样才能得到一部电话';Firemonkey移动应用程序中的联系人列表?,android,ios,delphi,firemonkey,delphi-xe5,Android,Ios,Delphi,Firemonkey,Delphi Xe5,如何在FireMonkey移动应用程序中获取手机的联系人列表?考虑到Delphi没有为该问题提供统一/包装的解决方案,您可以使用与使用本机编程API的程序员大致相同的方法来获取联系人列表 您需要研究Android SDK如何显示联系人列表以及iOS SDK如何显示联系人列表,然后使用本机API访问它 这两种平台之间的差异很大,但一旦您在两种不同的操作系统上建立了实现,并了解了这两种实现提供的内容和可访问的内容,就可以编写一些与操作系统无关的接口。这就是FMX在两个平台上实现的类似功能的其他实例中
给你。。它并没有完成,因为它读取了一个人的所有数字,若有两个数字,那个么列表中将列出两倍于此人的数字。。但从这里开始,我认为你可以工作并根据自己的需要进行调整:)) 致以最良好的祝愿, Kruno以下是我的代码(灵感来源于@mali Kruno,最初由@mali Kruno创建,我只是根据自己的需要进行了更改!),用于根据TEdit OnChange事件搜索所有联系人: 我在commonfunctions.pas单元中使用此函数:
function GetContact (Name: string; Number: string; const tip: integer) : TStringList;
var
cursorContactsPhone: JCursor;
Typo1, Typo2: string;
FindBy: JString;
ToFind: TJavaObjectArray<JString>;
CurRec: integer;
begin
Result:=TStringList.Create;
CurRec:=0;
ToFind:= TJavaObjectArray<JString>.Create(2);
if Name <> '' then
begin
ToFind.Items[0] := StringToJString('data1');
ToFind.Items[1] := StringToJString('display_name');
FindBy := StringToJString('display_name LIKE "%' + Name + '%"');
Typo1:='data1';
Typo2:='display_name';
end
else if Number <> '' then
begin
ToFind.Items[0] := StringToJString('display_name');
ToFind.Items[1] := StringToJString('data1');
FindBy := StringToJString('data1 LIKE "%' + Number + '%"');
Typo1:='display_name';
Typo2:='data1';
end;
cursorContactsPhone := SharedActivity.getContentResolver.query(TJCommonDataKinds_Phone.JavaClass.CONTENT_URI, ToFind, FindBy, nil, nil);
while (cursorContactsPhone.moveToNext) do
begin
Result.Add
(JStringToString(cursorContactsPhone.getString(cursorContactsPhone.getColumnIndex(StringToJString(Typo2)))) + ' - ' +
JStringToString(cursorContactsPhone.getString(cursorContactsPhone.getColumnIndex(StringToJString(Typo1)))));
CurRec:=CurRec+1;
end;
cursorContactsPhone.close;
end;
注意,结果是在函数中创建的一个TStringList,并在备忘录更新后在过程中释放。
另外请注意,我只在TEdit长度为2或更多时搜索,因为在TEdit中只输入“a”将显示所有姓名中有字母“a”的联系人,因此每次搜索时都会冻结一点,请使用退格等。。。
解决方法是在应用程序启动时将电话簿加载到TStringList中,然后仅搜索stringlist,但这不会带来其他问题:
a) 电话簿更新不会被检测到,或者您必须实现“更新”按钮,这样做根本没有意义。。
b) 应用程序启动需要更长的时间
c) 我还没有尝试过,也不确定它到底能加快多少搜索速度,因为Memo.Lines.Add比查询本身花费更多的时间,所以
至于重复项,你可以看到这里没有处理,因为目前我不需要这样做,但你可以在备忘录中使用“排序”轻松处理,或者,如果你不想丢失本来会显示为重复项的条目,可以在TStringList本身中管理它们,以便将数字合并到同一行,或者为每个名称创建子字符串列表(当然,只有当一个名称出现不止一次时,如果您不希望最终拥有实际需要的两倍多的字符串列表)
希望这能有所帮助。您是否阅读过有关此主题的文档?我不是用java或object c编写的,我使用的是Rad Studio XE5。嘿,我在使用此代码时遇到了问题。我得到了TJContactsContract\u Contacts.JavaClass.CONTENT\u URI和TJCommonDataKinds\u Phone.JavaClass.CONTENT\u URI的未声明标识符。你知道为什么,以及如何解决这个问题吗?谢谢你需要Androidapi.Jni.Provider来使用它,同时也要使用它:Androidapi.JNIBridge,Androidapi.Jni.GraphicsContentViewText,Androidapi.Jni.Net,Androidapi.Jni.JavaTypes,FMX.Helpers.Android…哈哈!缺少.Provider!:O其他的我都有了,谢谢。试图包括其他几个,但没有像看起来的那样联系到提供商:/谢谢!!!Ps:您是否碰巧有更新/更新版本的代码,该代码还删除了人的外观等的副本,或者在这方面没有做任何进一步的改进?:)很抱歉延迟重播:)。。。我将在这里发布过滤的解决方案,但我在我发布的站点上没有它。。。我会尽快完成,但你也可以:首先,将所有姓名和ID放入一个列表中,然后根据姓名在第二个列表中获取与姓名和PhoneID相关的号码:)我实际上已经让它工作了。:)无论如何谢谢你!!我对它进行了排序,所以我没有重复,我还使用tEdit.OnChange事件对它进行了自动搜索,通过名称查询“LIKE”属性,虽然它的工作速度非常慢,如果我只使用一个字母,那么我现在至少使用2个字符,并且工作得非常完美:)此示例在100%时不起作用,因为“data1”项用于在显示屏上显示电话号码(在某些型号的设备上,用于显示号码,例如空格或破折号)。最好使用“data4”项,因为它使用原始数据。
function GetContact (Name: string; Number: string; const tip: integer) : TStringList;
var
cursorContactsPhone: JCursor;
Typo1, Typo2: string;
FindBy: JString;
ToFind: TJavaObjectArray<JString>;
CurRec: integer;
begin
Result:=TStringList.Create;
CurRec:=0;
ToFind:= TJavaObjectArray<JString>.Create(2);
if Name <> '' then
begin
ToFind.Items[0] := StringToJString('data1');
ToFind.Items[1] := StringToJString('display_name');
FindBy := StringToJString('display_name LIKE "%' + Name + '%"');
Typo1:='data1';
Typo2:='display_name';
end
else if Number <> '' then
begin
ToFind.Items[0] := StringToJString('display_name');
ToFind.Items[1] := StringToJString('data1');
FindBy := StringToJString('data1 LIKE "%' + Number + '%"');
Typo1:='display_name';
Typo2:='data1';
end;
cursorContactsPhone := SharedActivity.getContentResolver.query(TJCommonDataKinds_Phone.JavaClass.CONTENT_URI, ToFind, FindBy, nil, nil);
while (cursorContactsPhone.moveToNext) do
begin
Result.Add
(JStringToString(cursorContactsPhone.getString(cursorContactsPhone.getColumnIndex(StringToJString(Typo2)))) + ' - ' +
JStringToString(cursorContactsPhone.getString(cursorContactsPhone.getColumnIndex(StringToJString(Typo1)))));
CurRec:=CurRec+1;
end;
cursorContactsPhone.close;
end;
procedure TMainF.ContactsSearch.Change(Sender: TObject);
var ResultNo: integer; SearchContacts: string; Results: TStringList;
begin // begin main procedure
if ContactsSearch.Text.Length > 1 then
begin //begin search and memo update
SearchContacts:=ContactsSearch.Text;
Results:=GetContact(SearchContacts, '', 0);
ResultNo:=0;
Memo1.Lines.Clear;
for ResultNo := 0 to Results.Count-1
do
begin
Memo1.Lines.Add(Results.Strings[ResultNo]);
end;
Results.Free;
end;
end;