5

FireMonkey モバイル アプリケーションで電話の連絡先リストを取得するにはどうすればよいですか?

4

3 に答える 3

3

どうぞ .. 1 人のすべての数字を読み取るため、まだ終了していません。数字が 2 つある場合は、この人がリスト内に 2 回リストされます.. しかし、ここから作業して、ニーズに合わせて調整できると思います :) )

function GetContact: TStringList;
var
cursorContacts, cursorContactsPhone: JCursor;
hasPhoneNumber: Integer;
id: Int64;
displayName, phoneNumber, contactID: string;
begin
Result := TStringList.Create;
cursorContacts := SharedActivity.getContentResolver.query(TJContactsContract_Contacts.JavaClass.CONTENT_URI, nil, nil, nil, nil);
if (cursorContacts.getCount > 0) then
begin
while (cursorContacts.moveToNext) do
begin
id := cursorContacts.getLong(cursorContacts.getColumnIndex(StringToJString('_ID')));
displayName := JStringToString(cursorContacts.getString(cursorContacts.getColumnIndex(StringToJString('DISPLAY_NAME'))));
hasPhoneNumber := cursorContacts.getInt(cursorContacts.getColumnIndex(StringToJString('HAS_PHONE_NUMBER')));
if (hasPhoneNumber > 0) then
begin
cursorContactsPhone := SharedActivity.getContentResolver.query(TJCommonDataKinds_Phone.JavaClass.CONTENT_URI, nil,StringToJString('CONTACT_ID = ' + IntToStr(id)),nil, nil);
while (cursorContactsPhone.moveToNext) do
begin
phoneNumber := JStringToString(cursorContactsPhone.getString(cursorContactsPhone.getColumnIndex(StringToJString('DATA1'))));
contactID := JStringToString(cursorContactsPhone.getString(cursorContactsPhone.getColumnIndex(StringToJString('CONTACT_ID'))));
Result.Add(displayName + ': ' + phoneNumber);
end;
cursorContactsPhone.close;
end;
end;
end;
cursorContacts.close;
end;

よろしく、クルーノ

于 2013-12-31T17:00:13.330 に答える
1

これは、TEdit OnChange イベントに基づいてすべての連絡先を検索するための私のコードです (@mali kruno に触発され、最初に作成されました。必要に応じて変更しただけです!)。

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;

次のように ContactSearch.Change イベント (TEdit コンポーネント) から呼び出します。

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;

Result、関数で作成され、 Memo の更新後にプロシージャで解放されるTStringList であることに注意してください。また、TEditの長さが2以上の場合にのみ検索することに注意してください、そうしないと、tedit に「a」だけを入力すると、名前に文字「a」が含まれるすべての連絡先が表示されるため、検索するたびに少しフリーズするため、バックスペースなどを使用します...回避策はロードすることですアプリケーションの起動時に TStringList の電話帳を検索し、文字列リストのみを検索しますが、それ以外の問題はほとんどありません: a) 電話帳の更新が検出されないか、「更新」ボタンを実装する必要があります。回避策を実行する意味はまったくありません.. b) アプリの起動に時間がかかります c) それを試したことはなく、実際にどれだけ検索が高速化されるかわかりません。Memo.Lines.Add は、クエリ自体、だから...

重複については、現在は処理する必要がないため、ここでは処理されていないことがわかりますが、メモの「並べ替え」を使用して簡単に処理できます。そうでなければ重複して表示されるエントリを削除したい場合は、それらを TStringList 自体の内部で管理して、同じ行で番号をマージするか、名前ごとにサブ文字列リストを作成します (もちろん、名前が 2 回以上表示される場合のみ)。 、実際に必要な文字列リストの 2 倍になることを望まない場合)。

お役に立てれば。

于 2014-02-20T16:06:09.190 に答える