【问题标题】:Find contact name by phone number in Android service (Delphi + Firemonkey)在Android服务中通过电话号码查找联系人姓名(Delphi + Firemonkey)
【发布时间】: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


    【解决方案1】:
    function GetContactByNumbers(const aPhoneNumbers: TList<String>): string;
    var
      wUri: JNet_URI;
      lookupID: String;
      wCursor,
      wSubCursor: JCursor;
      wLookup_Idx: Integer;
      wDisplayNameIdx: integer;
      wfilter,
      wJQueryParams: TJavaObjectArray<JString>;
      wDataUri: JNet_URI;
    begin
      wUri :=  TJContactsContract_Contacts.JavaClass.CONTENT_URI;
      wCursor := TAndroidHelper.Context.getContentResolver.query(wUri, nil, nil, nil, StringToJString('display_name ASC'));
       try
         wLookup_Idx := wCursor.getColumnIndex(StringToJString('lookup'));
         wDisplayNameIdx := wCursor.getColumnIndex(StringToJString('display_name'));
    
         while wCursor.moveToNext do
         begin
           lookupID := JStringToString(wCursor.getString(wLookup_Idx));
           wfilter := TJavaObjectArray<JString>.Create(1);
           wfilter[0] := TJCommonDataKinds_Phone.JavaClass.NUMBER;
    
           // Query condition (Extract only data for specific ID)
           wJQueryParams := TJavaObjectArray<JString>.Create(2);
           wJQueryParams[0] := TJCommonDataKinds_Phone.JavaClass.CONTENT_ITEM_TYPE;
           wJQueryParams[1] := StringToJString(lookupID);
    
           wDataUri := TJContactsContract_Data.JavaClass.CONTENT_URI;  // Contacts data uri
    
           wSubCursor := TAndroidHelper.Context.getContentResolver.
             Query(wDataUri,wfilter,StringToJString('mimetype = ? AND lookup = ?') , wJQueryParams,nil); // Exec query
    
           try
             if wSubCursor.getCount > 0 then
             begin
               while (wSubCursor.moveToNext) do
               begin
                 if aPhoneNumbers.Contains(JStringToString(wSubCursor.getString(0))) then
                 begin
                   Result := JStringToString(wCursor.getString(wDisplayNameIdx));
                   Break;
                 end;
               end;
             end;
           finally
             wSubCursor.close;
             wSubCursor := nil;
           end;
         end;
       finally
         wCursor.Close;
         wCursor := nil;
       end;
    end;
    

    【讨论】:

      【解决方案2】:

      来自: http://www.sql.ru/forum/1183758-2/dobavit-kontakt-v-android-address-book

      为我工作尝试:

      function TContactsManager.GetContactByNumber(
       const aPhoneNumber: string): string;
      var
       wUri: JNet_URI;
       wCursor: JCursor;
       wfilter,
       wJQueryParams: TJavaObjectArray<JString>;
      begin
       Result := '';
       wUri := TJNet_URI.JavaClass.withAppendedPath
      (
       TJContactsContract_PhoneLookup.JavaClass.CONTENT_FILTER_URI,
       StringToJString(aPhoneNumber)
      );
      
        wfilter := TJavaObjectArray<JString>.Create(2);
        wfilter[0] := StringToJString('lookup');
        wfilter[1] := StringToJString('display_name');
      
       with SharedActivity.getContentResolver do
        wCursor := query(wUri, wfilter, nil, nil, nil);
      
      try
         if Assigned(wCursor) and
         (wCursor.getCount > 0) then
        begin
        wCursor.moveToNext;
        Result := JStringToString(wCursor.getString(
          wCursor.getColumnIndex(StringToJString('display_name'))));
        end;
      finally
      wCursor.Close;
      wCursor := nil;
      end;
      end;
      
      enter code here
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-05
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多