Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавить контакт в Android Address book / 25 сообщений из 36, страница 1 из 2
06.11.2015, 16:23
    #39096799
Janex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Привет всем.
Разрыл пол интернета но таки ненашёл :(
Как получить список контактов (имя, фамилия, телефон итд.) нашёл,
но как добавить контак, удалит ?

WBR
Janex
...
Рейтинг: 0 / 0
06.11.2015, 16:41
    #39096814
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Janex,

куда???
...
Рейтинг: 0 / 0
06.11.2015, 16:50
    #39096824
Janex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
чччДJanex,

куда???

Как куда ? В телефон, в контакти ...
Например добавить имя, фамилия и телефонныи номер
...
Рейтинг: 0 / 0
06.11.2015, 17:30
    #39096860
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
JanexчччДJanex,

куда???

Как куда ? В телефон, в контакти ...
Например добавить имя, фамилия и телефонныи номер
http://habrahabr.ru/post/130148/

http://developer.android.com/intl/ru/training/contacts-provider/index.html
http://developer.android.com/intl/ru/reference/android/provider/ContactsContract.html
...
Рейтинг: 0 / 0
06.11.2015, 17:58
    #39096883
Janex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
чччД,

Да, конешно, если ето шутка, то ок ... :)
Если незаметил, то тут форум Delphi разработчиков ... если бы я в яве програмировал, то
нашёл бы без проблем.
Ишу пример как ето из дельфи сделать.
...
Рейтинг: 0 / 0
06.11.2015, 18:34
    #39096907
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
...
Рейтинг: 0 / 0
06.11.2015, 18:48
    #39096927
Janex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
kv67 http://www.fmxexpress.com/access-android-contacts-manager-with-firemonkey-in-delphi-xe5/
Ето я уже в первую очередь нашёл, ето работает, уже писал что получить список контактов уже умею :)
Но как вставить новыи или удалитькакои то - тут без примеров, как понемаю, надо яву знать :(
...
Рейтинг: 0 / 0
10.11.2015, 23:08
    #39100101
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Если еще актуально:

Сделал добавление контакта на основе этого примера: http://www.codeproject.com/Articles/578823/Android-Contact-Operations-Insert-Search-Delete

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
uses 
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Helpers.Android, Androidapi.JNI.provider, Androidapi.JNI.JavaTypes, FMX.Dialogs,
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Net, Androidapi.Jni.App,
  Androidapi.JNIBridge, Androidapi.Helpers, FMX.Platform.Android;

.....................................................................................................................................................

procedure TContactsManager.InsertToContacts(const displayName, firstName, lastName,  phone, eMail: string);
var
  ops: JArrayList;
  res: TJavaObjectArray<JContentProviderResult>;
  rawContactInsertIndex: integer;

const
  DATA_MIMETYPE    = 'mimetype';
  COMMON_DATA_TYPE = 'data2';

begin
  ops := TJArrayList.JavaClass.init;
  rawContactInsertIndex := ops.size;

  ops.add
  (
    TJContentProviderOperation.JavaClass.newInsert
      (
        TJContactsContract_RawContacts.JavaClass.CONTENT_URI
      ).withValue
        (
          TJSyncStateContract_Columns.JavaClass.ACCOUNT_TYPE, nil
        ).withValue
          (
            TJSyncStateContract_Columns.JavaClass.ACCOUNT_NAME, nil
          ).build
  );
     // name
  ops.add
  (
    TJContentProviderOperation.JavaClass.newInsert
      (
        TJContactsContract_Data.JavaClass.CONTENT_URI
      ).withValueBackReference
        (
          TJContacts_Entity.JavaClass.RAW_CONTACT_ID,
          rawContactInsertIndex
        ).withValue
          (
            StringToJString(DATA_MIMETYPE),
            TJCommonDataKinds_StructuredName.JavaClass.CONTENT_ITEM_TYPE
          ).withValue
          (
            TJCommonDataKinds_StructuredName.JavaClass.DISPLAY_NAME,
            StringToJString(displayName)
          ).withValue
          (
            TJCommonDataKinds_StructuredName.JavaClass.FAMILY_NAME,
            StringToJString(lastName)
          ).withValue
          (
            TJCommonDataKinds_StructuredName.JavaClass.GIVEN_NAME,
            StringToJString(firstName)
          ).build
      );
    // phone
  ops.add
    (
      TJContentProviderOperation.JavaClass.newInsert
        (
          TJContactsContract_Data.JavaClass.CONTENT_URI
        ).withValueBackReference
        (
          TJContacts_Entity.JavaClass.RAW_CONTACT_ID,
          rawContactInsertIndex
        ).withValue
        (
          StringToJString(DATA_MIMETYPE),
          TJCommonDataKinds_Phone.JavaClass.CONTENT_ITEM_TYPE
        ).withValue
        (
          TJCommonDataKinds_Phone.JavaClass.NUMBER,                                              
          StringToJString(phone)
        ).withValue
        (
          StringToJString(COMMON_DATA_TYPE),
          StringToJString(IntToStr(TJCommonDataKinds_Phone.JavaClass.TYPE_MOBILE))
        ).build
    );
     // E-Mail
  ops.add
    (
      TJContentProviderOperation.JavaClass.newInsert
        (
          TJContactsContract_Data.JavaClass.CONTENT_URI
        ).withValueBackReference
        (
          TJContacts_Entity.JavaClass.RAW_CONTACT_ID,
          rawContactInsertIndex
        ).withValue
        (
          StringToJString(DATA_MIMETYPE),
          TJCommonDataKinds_Email.JavaClass.CONTENT_ITEM_TYPE
        ).withValue
        (
          TJCommonDataKinds_Email.JavaClass.ADDRESS,
          StringToJString(eMail)
        ).withValue
        (
          StringToJString(COMMON_DATA_TYPE),
          StringToJString(IntToStr(TJCommonDataKinds_Email.JavaClass.TYPE_WORK))
        ).build
    );

  try
    res := SharedActivityContext.getContentResolver.applyBatch(TJContactsContract.JavaClass.AUTHORITY, ops);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;
...
Рейтинг: 0 / 0
10.11.2015, 23:10
    #39100102
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Delphi XE7
...
Рейтинг: 0 / 0
12.11.2015, 17:54
    #39102179
Janex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
kv67,
Ооооо, большое спасибо, работает ...
А, в друг, где то неваляется ешё пример удаления и коректировки ? :)
...
Рейтинг: 0 / 0
12.11.2015, 18:24
    #39102235
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Удаление:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TContactsManager.DeleteContact(const aLookupID: string);
var
  wDataUri: JNet_URI;

begin
  wDataUri := TJNet_URI.JavaClass.withAppendedPath
    (
     TJContactsContract_Contacts.JavaClass.CONTENT_LOOKUP_URI,
     StringToJString(aLookupID)
    );

   try
     TAndroidHelper.Context.getContentResolver.delete(wDataUri, nil, nil);
   except
     on E: Exception do
       ShowMessage('getContentResolver Delete error: ' + E.Message);
   end;
end;



Update чуть позже, потестировать нужно.
...
Рейтинг: 0 / 0
12.11.2015, 18:27
    #39102237
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Это уже DX10

если XE7, то вместо TAndroidHelper.Context - SharedActivityContext
...
Рейтинг: 0 / 0
12.11.2015, 21:47
    #39102399
Janex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
kv67Это уже DX10

если XE7, то вместо TAndroidHelper.Context - SharedActivityContext
Работает ...
Будеш в Латвие, скажи, с меня пиво/водка/вискии :) ... а то
был уже в ужасе - первыи раз всталкиваюсь, что в сети НИЧЕГО нету ВООБШЕ про етy темy,
тоесть примери на дельфах
...
Рейтинг: 0 / 0
13.11.2015, 01:00
    #39102503
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
JanexБудеш в Латвие, скажи, с меня пиво/водка/вискии :)
Спасибо за приглашение!
Надеюсь, что код пригодится.

Для Update:


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
procedure TContactsManager.UpdateContact(const aLookupID, aPhoneNumber,
  aDislpayName, aFirstName, aLastName, aEmail: string);
var
  ops: JArrayList;
  wJDislpayName,
  wJFirstName,
  wJLastName,
  wJPhone,
  wJEmail,
  wJQueryStr: JString;
  wJQueryParams: TJavaObjectArray<JString>;

  wSubCursor: JCursor;
  wfilter: TJavaObjectArray<JString>;
  wDataUri: JNet_URI;

begin
  if Trim(aLookupID) = '' then
  begin
    ShowMessage('Contact ID is null!!!');
    Exit;
  end;

  wJQueryStr := StringToJString('mimetype = ? AND lookup = ?');
  wDataUri := TJContactsContract_Data.JavaClass.CONTENT_URI;

  // Names

  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;

  wJQueryParams := TJavaObjectArray<JString>.Create(2);
  wJQueryParams[0] := TJCommonDataKinds_StructuredName.JavaClass.CONTENT_ITEM_TYPE;
  wJQueryParams[1] := StringToJString(aLookupID);

  with SharedActivityContext.getContentResolver do
    wSubCursor := 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;
  finally
    wSubCursor.close;
    wSubCursor := nil;
  end;

  if Trim(aDislpayName) <> '' then
    wJDislpayName := StringToJString(Trim(aDislpayName));

  if Trim(aFirstName) <> '' then
    wJFirstName := StringToJString(Trim(aFirstName));

  if Trim(aLastName) <> '' then
    wJLastName := StringToJString(Trim(aLastName));

  ops := TJArrayList.JavaClass.init;

  wJQueryParams := TJavaObjectArray<JString>.Create(2);
  wJQueryParams[0] := TJCommonDataKinds_StructuredName.JavaClass.CONTENT_ITEM_TYPE;
  wJQueryParams[1] := StringToJString(aLookupID);

  ops.add
    (
      TJContentProviderOperation.JavaClass.newUpdate
      (
        TJContactsContract_Data.JavaClass.CONTENT_URI
      ).withSelection
      (
        wJQueryStr, wJQueryParams
      ).withValue
      (
        TJCommonDataKinds_StructuredName.JavaClass.DISPLAY_NAME,
        wJDislpayName
      ).withValue
      (
        TJCommonDataKinds_StructuredName.JavaClass.GIVEN_NAME,
        wJFirstName
      ).withValue
      (
        TJCommonDataKinds_StructuredName.JavaClass.FAMILY_NAME,
        wJLastName
      ).build
    );

  // Phone

  wfilter := TJavaObjectArray<JString>.Create(1);
  wfilter[0] := TJCommonDataKinds_Phone.JavaClass.NUMBER;

  wJQueryParams := TJavaObjectArray<JString>.Create(2);
  wJQueryParams[0] := TJCommonDataKinds_Phone.JavaClass.CONTENT_ITEM_TYPE;
  wJQueryParams[1] := StringToJString(aLookupID);

  with SharedActivityContext.getContentResolver do
    wSubCursor := Query(wDataUri, wfilter, wJQueryStr, wJQueryParams, nil);
  try
    if wSubCursor.getCount > 0 then
    begin
      // Getting only first phone number , a contact can have multiple phone numbers, so if needed,
      // we need to loop on each row (while (wSubCursor.moveToNext) do)
      wSubCursor.moveToNext;
      wJPhone := wSubCursor.getString(0);
    end;
  finally
    wSubCursor.close;
    wSubCursor := nil;
  end;

  if Trim(aPhoneNumber) <> '' then
  begin
    wJPhone := StringToJString(Trim(aPhoneNumber));

    wJQueryParams := TJavaObjectArray<JString>.Create(2);
    wJQueryParams[0] := TJCommonDataKinds_Phone.JavaClass.CONTENT_ITEM_TYPE;
    wJQueryParams[1] := StringToJString(aLookupID);

    ops.add
      (
        TJContentProviderOperation.JavaClass.newUpdate
        (
          TJContactsContract_Data.JavaClass.CONTENT_URI
        ).withSelection
        (
          wJQueryStr, wJQueryParams
        ).withValue
        (
          TJCommonDataKinds_Phone.JavaClass.NUMBER,
          wJPhone
        ).build
      );
  end;

  // E-Mail

  wfilter := TJavaObjectArray<JString>.Create(1);
  wfilter[0] := TJCommonDataKinds_Email.JavaClass.ADDRESS;

  wJQueryParams := TJavaObjectArray<JString>.Create(2);
  wJQueryParams[0] := TJCommonDataKinds_Email.JavaClass.CONTENT_ITEM_TYPE;
  wJQueryParams[1] := StringToJString(aLookupID);

  with SharedActivity.getContentResolver do
    wSubCursor := Query(wDataUri, wfilter, wJQueryStr, wJQueryParams, nil);
  Try
    if wSubCursor.getCount > 0 then
    begin
      // Getting only first email , a contact can have many emails, so if needed,
      // we need to loop on each row (while (wSubCursor.moveToNext) do)
      wSubCursor.moveToNext;
      wJEmail := wSubCursor.getString(0);
    end;
  Finally
    wSubCursor.close;
    wSubCursor := nil;
  End;

  if Trim(aEmail) <> '' then
  begin
    wJEmail := StringToJString(Trim(aEmail));

    wJQueryParams := TJavaObjectArray<JString>.Create(2);
    wJQueryParams[0] := TJCommonDataKinds_Email.JavaClass.CONTENT_ITEM_TYPE;
    wJQueryParams[1] := StringToJString(aLookupID);

    ops.add
      (
        TJContentProviderOperation.JavaClass.newUpdate
        (
          TJContactsContract_Data.JavaClass.CONTENT_URI
        ).withSelection
        (
          wJQueryStr, wJQueryParams
        ).withValue
        (
          TJCommonDataKinds_Email.JavaClass.ADDRESS,
          wJEmail
        ).build
      );
  end;

  if ops.size > 0 then
    try
      SharedActivityContext.getContentResolver.applyBatch(TJContactsContract.JavaClass.AUTHORITY, ops);
//    TAndroidHelper.Context.getContentResolver.applyBatch(TJContactsContract.JavaClass.AUTHORITY, ops); // DELPHI DX10
    except
      on E: Exception do
        ShowMessage('getContentResolver ApplyBatch for Update  error: ' + E.Message);
    end;
end;




Взял за основу http://www.fmxexpress.com/access-android-contacts-manager-with-firemonkey-in-delphi-xe5/

Все мои примеры не являются окончательными и требуют доработки, но основное направление дают.

Надеюсь, пригодится.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.02.2018, 21:14
    #39597782
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
kv67, спасибо, разбираю твои примеры.
Пока не до конца понял, как правильно найти имя контакта по номеру телефона? Тем более, что номеров может быть несколько.
...
Рейтинг: 0 / 0
07.02.2018, 10:27
    #39597968
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
X11,

Честно говоря, я забросил этот проект.

На вскидку могу предположить, что поиск по номеру телефона должен выглядеть как-то так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
function TContactsManager.FindContact(const aLookupNumber: string): String;
var
  ops: JArrayList;
  wJDislpayName,
  wJFirstName,
  wJLastName,
  wJPhone,
  wJEmail,
  wJQueryStr: JString;
  wJQueryParams: TJavaObjectArray<JString>;

  wSubCursor: JCursor;
  wfilter: TJavaObjectArray<JString>;
  wDataUri: JNet_URI;

begin
  wJQueryStr := StringToJString('mimetype = ? AND lookup = ?');
  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;

  wJQueryParams := TJavaObjectArray<JString>.Create(2);
  wJQueryParams[0] := TJCommonDataKinds_Phone.JavaClass.NUMBER;;
  wJQueryParams[1] := StringToJString(aLookupNumber);

  with SharedActivityContext.getContentResolver do
    wSubCursor := 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 := wJDislpayName; 
  finally
    wSubCursor.close;
    wSubCursor := nil;
  end;
end;



Возможно, где-то в коде ошибся, не проверял, нет студии под рукой.
Вечером проверю, напишу.
...
Рейтинг: 0 / 0
07.02.2018, 10:59
    #39598005
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
спасибо


kv67
Код: pascal
1.
TJCommonDataKinds_StructuredName



в delphi нет ни примеров, ни справки :(
...
Рейтинг: 0 / 0
07.02.2018, 19:32
    #39598523
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Вроде бы работает, только маленькая поправочка:

Код: pascal
1.
Result := JStringToString(wJDislpayName);
...
Рейтинг: 0 / 0
07.02.2018, 19:35
    #39598529
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
А как сделать поиск, если нужно найти несколько телефонов?
Имеется ввиду, что в контактах может быть записан неполный номер, т.е. без кода страны?
Т.е. передать 2 параметра поиска:
1. Полный номер +380501234567.
2. Без кода страны 0501234567.
...
Рейтинг: 0 / 0
07.02.2018, 21:19
    #39598587
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
X11Вроде бы работает, только маленькая поправочка:

Нет, не работает. Добавил тестовый простой номер типа 0000 в адресную книгу. Выполняю поиск, но wSubCursor.getCount возвращает ноль.
...
Рейтинг: 0 / 0
08.02.2018, 00:52
    #39598641
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
X11,

У меня вот так получилось:


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
function TContactsManager.GetContactByNumber(
  const aPhoneNumber: 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;
   with SharedActivity.getContentResolver do
      wCursor := 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;

       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
       with SharedActivity.getContentResolver do
         wSubCursor := Query(wDataUri,wfilter,StringToJString('mimetype = ? AND lookup = ?') , wJQueryParams,nil); // Exec query
       try
         if wSubCursor.getCount > 0 then
         begin
           while (wSubCursor.moveToNext) do
           begin
             if JStringToString(wSubCursor.getString(0)) = aPhoneNumber 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;

function TContactsManager.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;
   with SharedActivity.getContentResolver do
      wCursor := 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;

       // Qurey condition (Exrtact 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
       with SharedActivity.getContentResolver do
         wSubCursor := 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;


...
Рейтинг: 0 / 0
08.02.2018, 16:10
    #39599193
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Вопрос про
Код: pascal
1.
wCursor := nil;



Именно так и должно быть?
Безо всяких Free и Despose?
...
Рейтинг: 0 / 0
08.02.2018, 17:37
    #39599295
kv67
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
X11,

Честно говоря, я эту реализацию нашел уже готовую, немного подправил только.

Нужно исходники смотреть для типа JCursor.
...
Рейтинг: 0 / 0
08.02.2018, 20:12
    #39599384
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
kv67, спасибо огромное. Работает.
Немного подкорректировал под современную Delphi.
Нужно использовать TAndroidHelper.Context вместо SharedActivity.
...
Рейтинг: 0 / 0
08.02.2018, 20:17
    #39599386
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить контакт в Android Address book
Сейчас я с этим кодом как, извините, обезьяна
Толку, что я его получил. Не до конца понимаю, как он работает, как его можно менять для других случаев.
Уважаемые разработчики Firemonkey, если Вы это прочитайте, то убедительно прошу добавить справку и описание по TJContactsContract_Contacts, TJCommonDataKinds_Phone, TAndroidHelper.Context.getContentResolver.query.
Т.е. что и в каком виде туда передавать.
Можно ли для отладки получать готовый SQL запрос, а то он выдаётся только в случае exception.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Добавить контакт в Android Address book / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]