Android 我怎样才能得到一部电话';Firemonkey移动应用程序中的联系人列表?

Android 我怎样才能得到一部电话';Firemonkey移动应用程序中的联系人列表?,android,ios,delphi,firemonkey,delphi-xe5,Android,Ios,Delphi,Firemonkey,Delphi Xe5,如何在FireMonkey移动应用程序中获取手机的联系人列表?考虑到Delphi没有为该问题提供统一/包装的解决方案,您可以使用与使用本机编程API的程序员大致相同的方法来获取联系人列表 您需要研究Android SDK如何显示联系人列表以及iOS SDK如何显示联系人列表,然后使用本机API访问它 这两种平台之间的差异很大,但一旦您在两种不同的操作系统上建立了实现,并了解了这两种实现提供的内容和可访问的内容,就可以编写一些与操作系统无关的接口。这就是FMX在两个平台上实现的类似功能的其他实例中

如何在FireMonkey移动应用程序中获取手机的联系人列表?

考虑到Delphi没有为该问题提供统一/包装的解决方案,您可以使用与使用本机编程API的程序员大致相同的方法来获取联系人列表

您需要研究Android SDK如何显示联系人列表以及iOS SDK如何显示联系人列表,然后使用本机API访问它

这两种平台之间的差异很大,但一旦您在两种不同的操作系统上建立了实现,并了解了这两种实现提供的内容和可访问的内容,就可以编写一些与操作系统无关的接口。这就是FMX在两个平台上实现的类似功能的其他实例中所做的

如果所需的API尚未导入到Delphi的RTL中(这是很有可能的),那么您还需要为所需的API编写导入,以便能够首先调用它们

执行摘要:

  • 卷起袖子
  • 陷入困境
  • 你自己编吧
  • 享受一些很酷的API工作带来的乐趣

  • 给你。。它并没有完成,因为它读取了一个人的所有数字,若有两个数字,那个么列表中将列出两倍于此人的数字。。但从这里开始,我认为你可以工作并根据自己的需要进行调整:))

    致以最良好的祝愿, 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;