DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 0
在线用户: 9
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2022/10/3 5:14:57
标题:
How to read your "contacts" in Mobile (Android in special) using TAddressBook by Emailx45 浏览:666
加入我的收藏
楼主: NOTE: if you needs "write" new contacts or updates, just use the "TAddressBookContact/s" to add/update your data!
It's easy like read!!!

----------

this sample just read: Groups and Contacts (in Group or All)
----------

uses
...
  System.Permissions;

type
  TForm2 = class(TForm)
    AddressBook1: TAddressBook;
    Layout1: TLayout;
    ToolBar1: TToolBar;
    SBreadAddressBook: TSpeedButton;
    TabControl1: TTabControl;
    TabItem1: TTabItem;
    TabItem2: TTabItem;
    Layout3: TLayout;
    ComboBox1: TComboBox;
    ListView1: TListView;
    EdtContactName: TEdit;
    Text1: TText;
    procedure SBreadAddressBookClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    procedure RequestPermAddressBook(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
    procedure DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
    //
    procedure GetAllGroupsOnAddressBook;
    //
    procedure GetAllContactsInGroupOnAddressBook(ABookGroup: TAddressBookGroup);
    procedure GetAllContactsOnAddressBook;
    //
    procedure FillListViewContacts(ABookContacts: TAddressBookContacts);
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

uses
  FMX.DialogService,
  // Android units...
  FMX.Helpers.Android,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
  Androidapi.JNI.OS
  // -----
    ;

var
  MyArrayPermissionsExternalStorage: TArray<string>;
  MyArrayPermissionsAddressBook    : TArray<string>;

procedure TForm2.FormCreate(Sender: TObject);
begin
  //
end;

procedure TForm2.GetAllGroupsOnAddressBook;
var
  LAddressBookGroups: TAddressBookGroups;
begin
  LAddressBookGroups := nil;
  LAddressBookGroups := TAddressBookGroups.Create;
  //
  AddressBook1.AllGroups(AddressBook1.DefaultSource, LAddressBookGroups);
  //
  ComboBox1.Items.Clear;
  //
  ComboBox1.BeginUpdate;
  try
    for var MyItem in LAddressBookGroups do
      ComboBox1.Items.Add(MyItem.ID.ToString + ', ' + MyItem.Name);
  finally
    ComboBox1.EndUpdate;
  end;
end;

procedure TForm2.GetAllContactsInGroupOnAddressBook(ABookGroup: TAddressBookGroup);
var
  LAddressBookContacts: TAddressBookContacts;
begin
  LAddressBookContacts := nil;
  //
  LAddressBookContacts := TAddressBookContacts.Create;
  //
  AddressBook1.AllContactsInGroup(ABookGroup, LAddressBookContacts);
  //
  FillListViewContacts(LAddressBookContacts);
end;

procedure TForm2.GetAllContactsOnAddressBook;
var
  LAddressBookContacts: TAddressBookContacts;
begin
  LAddressBookContacts := nil;
  //
  LAddressBookContacts := TAddressBookContacts.Create;
  //
  AddressBook1.AllContacts(AddressBook1.DefaultSource, LAddressBookContacts);
  //
  FillListViewContacts(LAddressBookContacts);
end;

procedure TForm2.FillListViewContacts(ABookContacts: TAddressBookContacts);
var
  LListViewItem: TListViewItem;
begin
  ListView1.Items.Clear;
  //
  ListView1.BeginUpdate;
  try
    for var MyItem in ABookContacts do
      begin
        LListViewItem      := ListView1.Items.Add;
        LListViewItem.Text := MyItem.DisplayName;
      end;
  finally
    ListView1.EndUpdate;
  end;
end;

procedure TForm2.RequestPermAddressBook(Sender: TObject; const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray);
  function AllGrantsItsOK(const AGrants: TClassicPermissionStatusDynArray): boolean;
  var
    LResult: integer;
  begin
    LResult := 1; // => TPermissionStatus = Denied
    //
    for var MyBool in AGrants do
      LResult := LResult + integer(MyBool);
    //
    result := (LResult - 1) = 0;
  end;

begin
  // It's mandatory: GetAccounts, ReadContacts!!!
  if (Length(APermissions) = Length(MyArrayPermissionsAddressBook)) and AllGrantsItsOK(AGrantResults) then
    begin
      GetAllGroupsOnAddressBook;
      //
      ComboBox1.ItemIndex := 0; // fill the listview...
    end;
end;

procedure TForm2.DisplayRationale(Sender: TObject; const APermissions: TClassicStringDynArray; const APostRationaleProc: TProc);
  function HaveIThisPermission(const APerm: TClassicStringDynArray; const AHave: TArray<string>): boolean;
  begin
    result := false;
    //
    for var A in APerm do
      for var B in AHave do
        if A = B then
          exit(true);
  end;

var
  RationaleMsg: string;
begin
  RationaleMsg := '';
  //
  // It's possible "join it" for just one avaliation!!! -> it's needs review like do it to show the "message"!!!
  //
  if HaveIThisPermission(APermissions, MyArrayPermissionsAddressBook) then
    RationaleMsg := RationaleMsg + 'The app needs permissions to look in your address book'
  else if HaveIThisPermission(APermissions, MyArrayPermissionsExternalStorage) then
    RationaleMsg := RationaleMsg + 'The app needs permissions to look in your external storage'
  else
    // other...
      ;
  //
  // Show an explanation to the user *asynchronously* - don't block this thread waiting for the user's response!
  // After the user sees the explanation, invoke the post-rationale routine to request the permissions
  TDialogService.ShowMessage(RationaleMsg,
    procedure(const AResult: TModalResult)
    begin
      APostRationaleProc
    end)
end;

procedure TForm2.ComboBox1Change(Sender: TObject);
var
  LAddressBookGroup: TAddressBookGroup;
begin
  if (ComboBox1.ItemIndex > -1) then
    begin
      LAddressBookGroup := AddressBook1.GroupByID(ComboBox1.ItemIndex + 1); // { First Group = 1 }
      //
      GetAllContactsInGroupOnAddressBook(LAddressBookGroup);
    end;
end;

procedure TForm2.SBreadAddressBookClick(Sender: TObject);
begin
  PermissionsService.RequestPermissions(MyArrayPermissionsAddressBook, RequestPermAddressBook, DisplayRationale);
end;

initialization

MyArrayPermissionsExternalStorage := [          { not necessary in AddressBook reading... }
  JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE), { if used... }
JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)   { if used... }
  ];

MyArrayPermissionsAddressBook := [          { }
  JStringToString(TJManifest_permission.JavaClass.GET_ACCOUNTS), { mandatory! }
JStringToString(TJManifest_permission.JavaClass.READ_CONTACTS),  { mandatory! }
JStringToString(TJManifest_permission.JavaClass.WRITE_CONTACTS)  { only if save new contacts! }
  ];

finalization

end.
此帖子包含附件:
PNG 图像
大小:37.3K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.85742毫秒 RSS