Telefon rehberini okuma - çözüldü

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Cevapla
Kullanıcı avatarı
dogan
Üye
Mesajlar: 173
Kayıt: 17 Eki 2014 10:11

Telefon rehberini okuma - çözüldü

Mesaj gönderen dogan »

Merhaba,

10.1 berlin kullanıyorum AddressBook1 ile telefon rehberini listviewe almak için bir çok yöntem denedim olmadı; Telefondan kişi adı ve telefon numarasını nasıl alabilirim?

Kod: Tümünü seç

procedure TForm6.FormShow(Sender: TObject);
var
  I: Integer;
  Contacts: TAddressBookContacts;
  Contact: TAddressBookContact;
begin
  try
    RehberListView.BeginUpdate;
    Contacts := TAddressBookContacts.Create;
    try
      AddressBook1.AllContacts(AddressBook1.DefaultSource, Contacts);
      with RehberListView.Items.add do
      begin
        Text := Contact.DisplayName;
      end;

    finally
      RehberListView.EndUpdate;
      Contacts.Free;
    end;

  finally

  end;
end;
En son dogan tarafından 11 May 2016 11:51 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: Telefon rehberini okuma

Mesaj gönderen fesiharslan »

Merhaba;
Yazmayayım diyorum ama dayanamıyorum. (Neden diye soracak olursan. :?: Bir kitap çalışmam var. Yaza yaza Kitaba bir şey kalmayacak Kitap içeriğini paylaşıyorum.[Anlatım hariç] :) )
Örnek bir proje paylaşıyorum.
Resim

Uygulam Linki:
https://mega.nz/#!2UkmHYoC!cZg6sUi-bnLg ... z5oSBOY590

Lisans Bilgisi: Kullanım ve geliştirme haklarının tümünü size devrediyorum. Adımı anmanız yeterlidir.
Hayırlı olsun...
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Telefon rehberini okuma

Mesaj gönderen brs »

fesiharslan yazdı:Merhaba;
Yazmayayım diyorum ama dayanamıyorum. (Neden diye soracak olursan. :?: Bir kitap çalışmam var. Yaza yaza Kitaba bir şey kalmayacak Kitap içeriğini paylaşıyorum.[Anlatım hariç] :) )
Örnek bir proje paylaşıyorum.


Uygulam Linki:
https://mega.nz/#!2UkmHYoC!cZg6sUi-bnLg ... z5oSBOY590

Lisans Bilgisi: Kullanım ve geliştirme haklarının tümünü size devrediyorum. Adımı anmanız yeterlidir.
Hayırlı olsun...

Hocam bence doğru yoldasınız yazmaya devam edin, burada ki her soru kitabınız için bir örnek bir nevi malzeme oluyor, ve açıkçası kitabınızı merakla bekliyorum kısmetse ne zaman biter...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: Telefon rehberini okuma

Mesaj gönderen fesiharslan »

:oops:
brs yazdı: Hocam bence doğru yoldasınız yazmaya devam edin, burada ki her soru kitabınız için bir örnek bir nevi malzeme oluyor, ve açıkçası kitabınızı merakla bekliyorum kısmetse ne zaman biter...
Önerin için teşekkür ederim. Paylaştığım kod zaten kitapta "Rehber Okuma" başlığı altından yapılan alıntıdır. Formun avantajı ise sizin de belirttiğiniz gibi potansiyel konu yoğunluğunu yakalamak ve karşı tarafın anlayabileceği dilde sade ve anlaşılır bir anlatım tarzı yakalamak.

Kitabı uzun süreden beri yoğun bir şekilde tamamlamaya çalışıyorum. Fakat belirlediğim konu içeriği çok kapsamlı olduğundan, uzan sürüyor.
Kitabı 1-1,5 aya tamamlarım İnşaallah (Yayınevi aşaması hariç)
Kullanıcı avatarı
dogan
Üye
Mesajlar: 173
Kayıt: 17 Eki 2014 10:11

Re: Telefon rehberini okuma

Mesaj gönderen dogan »

fesiharslan hocam kitabınızı bende sabırsızlıkla bekleyenlerdenim...

Hocam örnek paylaşımımızı kendime göre düzenledim ve ayrıca kodları olduğu gibi de kullandım telefonda test edince resimdeki hatayı aldım bunun sebebi ne olabilir?

Resim

Kod: Tümünü seç

procedure TForm6.Button1Click(Sender: TObject);
var
  I: Integer;
  LItem: TListViewItem;
  Rehber: TAddressBookContacts;
begin
  Rehber := TAddressBookContacts.Create;
  with TelefonListView do
  begin
    TelefonListView.BeginUpdate;
    try
      Items.Clear;
      AddressBook1.AllContacts(AddressBook1.DefaultSource, Rehber);

      for i := 0 to Rehber.Count - 1 do
      begin
        LItem := Items.Add;
        LItem.Text := Rehber.Items[I].DisplayName;
        if (Rehber.Items[I].Phones.Count >= 1) and (not Rehber.Items[I].Phones[0].Number.IsEmpty) then
          LItem.Data[TMultiDetailAppearanceNames.Detail1] :=  Rehber.Items[I].Phones[0].Number;
      end;
    finally
      EndUpdate;
          Rehber.Free;
    end;
  end;
end;

Kod: Tümünü seç

procedure TForm6.Button2Click(Sender: TObject);
var
  I: Integer;
  Rehber: TAddressBookContacts;
begin
  Rehber := TAddressBookContacts.Create;
  try
    AddressBook1.AllContacts(AddressBook1.DefaultSource, Rehber);
    ListView1.BeginUpdate;
    for i := 0 to Rehber.Count - 1 do
    begin
      with ListView1.Items.Add do
      begin
        Data['Text2'] := Rehber.Items[I].DisplayName;
        if (Rehber.Items[I].Phones.Count >= 1) and (not Rehber.Items[I].Phones[0].Number.IsEmpty) then
          Data['Text3'] := Rehber.Items[I].Phones[0].Number { ilk numara }
        else
          Data['Text3'] := 'Numara Yok'
      end;
    end;
  finally
    ListView1.EndUpdate;
    Rehber.Free;
  end;
end;
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: Telefon rehberini okuma

Mesaj gönderen fesiharslan »

Rehbere erişim izniniz olmadığı için bu uyarıyı alıyorsunuz.
Çözüm için;
Project > Options > Uses Permissions bölümünden Get Accounts, Read Contacts ve Write Contacts yetkilerini True yapın.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Telefon rehberini okuma

Mesaj gönderen brs »

Üstadım sizin örnek uygulamanız ve kendi uygulamamda test yaptım; Listviewe sadece mail adresi geliyor telefon veya numaraları listelemiyor bu durum neden olabilir? sizin örnek resimdeki görselde isim ve numaralar var.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  LItem: TListViewItem;
  Contacts: TAddressBookContacts;
begin
  Contacts := TAddressBookContacts.Create;
  with TelefonListView do
  begin
    AddressBook1.AllContacts(AddressBook1.DefaultSource, Contacts);
    Items.Clear;
    BeginUpdate;
    try
      for I := 0 to Contacts.Count - 1 do
      begin
        LItem := Items.Add;
        LItem.Text := Contacts.Items[I].DisplayName;
        LItem.Data[TMultiDetailAppearanceNames.Detail1] := Contacts.Items[I].FirstName;
        LItem.Data[TMultiDetailAppearanceNames.Detail2] := Contacts.Items[I].Phones;
        LItem.Data[TMultiDetailAppearanceNames.Detail3] := Contacts.Items[I].NickName;
      end;
    finally
      EndUpdate;
      Contacts.Free;
    end;
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: Telefon rehberini okuma

Mesaj gönderen fesiharslan »

brs yazdı:Üstadım sizin örnek uygulamanız ve kendi uygulamamda test yaptım; Listviewe sadece mail adresi geliyor telefon veya numaraları listelemiyor bu durum neden olabilir? sizin örnek resimdeki görselde isim ve numaralar var.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  LItem: TListViewItem;
  Contacts: TAddressBookContacts;
begin
  Contacts := TAddressBookContacts.Create;
  with TelefonListView do
  begin
    AddressBook1.AllContacts(AddressBook1.DefaultSource, Contacts);
    Items.Clear;
    BeginUpdate;
    try
      for I := 0 to Contacts.Count - 1 do
      begin
        LItem := Items.Add;
        LItem.Text := Contacts.Items[I].DisplayName;
        LItem.Data[TMultiDetailAppearanceNames.Detail1] := Contacts.Items[I].FirstName;
        LItem.Data[TMultiDetailAppearanceNames.Detail2] := Contacts.Items[I].Phones;
        LItem.Data[TMultiDetailAppearanceNames.Detail3] := Contacts.Items[I].NickName;
      end;
    finally
      EndUpdate;
      Contacts.Free;
    end;
  end;
end;
Merhaba @brs Bey,
Kodunuzu test ettim.
DisplayName Alanı:
DisplayName alanı ad+Soyad alanını gösterir. Fakat rehberde kişi kaydı oluşturulurken bu iki alanın boş olduğunda (bazen ön ad veya son ad alanlarına kayıt yapılabilir) DisplayName alanı Android platformunda e-mail adresi, iOS platformunda ise şirket adını gösterilir.
Burdan da şu çıkar uygulamayı Android telefonda test ettiniz. (DisplayName alanı boş olduğu için e-mail adresi listeleniyor)
FirstName:
Adı alanıdır. Rehberinizde bir önceki alanda bilgi olmayışının sebebi FirstName alanının boş olmasından kaynaklanıyor. Yani rehberinizde İsim farklı bir alanda kayıtlı.
NickName:
Kişiyi daha iyi tanımlamak amacıyla kullanılan özel bir isim alanıdır. Sosyal medyadan da bildiğiniz gibi.. örn: @brs
Kültürümüzde yaygın olmadığından bu alanın boş olma ihtimali de yüksektir.
son olarak Phones alanından bahsedeyim.
Phones:
Bu alan TContactPhone sınıfının dizi tipi olan TContactPhones tipindedir. Temelde Object List olarak tutulur. Dolayısıyla doğudan Phones özelliği ile telefon bilgisine ulaşılamaz. Telefon bilgisini almak için TContactPhones dizisi bir döngü ile kontrol edilerek bir kişiye ait tüm telefonlar listelenebilir.
Yada

Kod: Tümünü seç

LItem.Data[TMultiDetailAppearanceNames.Detail2] := Contacts.Items[I].Phones[0].Number;
şeklinde bir kod kullanarak, rehberde kişiye ait ilk telefon numarasını (Rehberde bir kişiye ait birden fazla telefon numarası kaydı oluşturulabiliyor) gösterebilirsiniz.

İyi çalışmalar..
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Telefon rehberini okuma

Mesaj gönderen brs »

Cevabınız için çok teşekkür derim...

İki sorun var 1. çok yavaş listeleniyor ortalama 5-6 saniye, 2. bazı kişilerden ikişer tane listeliyor, sizce bu neden olabilir?

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  TelefonRehber: TAddressBookContacts;
  C: TAddressBookContact;
  LItem: TListViewItem;
begin
  TelefonRehber := TAddressBookContacts.Create;
  try
    AddressBook1.AllContacts(TelefonRehber);
    TelefonListView.Items.Clear;
    TelefonListView.BeginUpdate;
    for C in TelefonRehber do
    begin
      LItem := TelefonListView.Items.Add;
      LItem.Text := C.DisplayName;
      LItem.Data[TMultiDetailAppearanceNames.Detail1] := C.Phones[0].Number;
    end;
  finally
    TelefonListView.EndUpdate;
    TelefonRehber.Free;
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: Telefon rehberini okuma

Mesaj gönderen fesiharslan »

Rica ederim. Amacımız birbirimize destek olmak.
Yavaş listelenmesinin sebebi ;
Bana göre mobil veri tabanının index yapısından kaynaklanıyor. Bu kanıya nereden vardım derseniz, telefonu yeniden başlatıp, hemen rehbere girmeye çalışırsanız, rehberin belli bir süre sonra yüklendiğini görürsünüz. Bazı telefon modellerinde (benim telefonunda olduğu gibi. Asus Zenfone 5) kullanıcı arayüzü gelmeden rehber kaydı alınmakta ve daha sıra arayüz gelmektedir. Bu durumda Kullanıcı telefon açılır açılmaz rehberi kullanabilmektedir. Fakat bu durum açılış süresini uzatmaktadır. Aslında bu çözüm gibi görünüyor fakat bana göre işin hilesi gibi birşey. (Kullanıcılar açılıştan hemen sonra rehber ne kadar geç yükleniyor demesinler diye galiba.)
Farkı bir çözüm yoluda bulunabilir tabi.
VCL uygulamalardan aşina olduğumuz Thread yöntemini kullanarak bu durumu bir nebze düzeltebiliriz. Yani listele butonuna tıkladığımız anda kayıtlar teker teker listelenecek. Biz ilk kayıtlara göz atarken 8-10 sn. Sonra tüm kayıtlar arka planda yüklenmiş olacaktır.

İkinci sorunuzun cevabını vermek çok zor. Rehberinizde çift kayıt olması durumu haricinde, aklıma başka bir ihtimal gelmiyor. Çift kayıt neden olabilir. Contact List'te yalnızca telefonu olan kişiler yer almaz, kişi haricinde diğer hesap bilgilerimizde (gmail, microsoft vb.) yer alan ve telefon ile senkronize edilmiş kişiler de listelenir.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Telefon rehberini okuma

Mesaj gönderen brs »

Telefon rehberimde her kayıttan birer tane var, kişiler telefon rehberini değil sim kartta kayıtlı.
En son brs tarafından 10 May 2016 11:03 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: Telefon rehberini okuma

Mesaj gönderen fesiharslan »

Bende böyle bir durum olmadı. Rehberimde 350 kayıt var ve çift kayıt oluşmuyor.
Diğer arkadaşlar da test edip, sonuç konusunda geri dönüş yapabilirlerse bir kanıya varabiliriz.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Telefon rehberini okuma

Mesaj gönderen brs »

fesiharslan yazdı:Bende böyle bir durum olmadı. Rehberimde 350 kayıt var ve çift kayıt oluşmuyor.
Diğer arkadaşlar da test edip, sonuç konusunda geri dönüş yapabilirlerse bir kanıya varabiliriz.

Üstadım sorunu buldum, LG G3 kullanıyorum ve telefon rehberi olarak sim kart seçili, arka planda telefon sim kartı kopyalamış bu durumu fark edip fazla oluşturulmuş olan kişileri silince listeleme normale döndü; Kusura bakmayın...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Telefon rehberini okuma

Mesaj gönderen Lost Soul »

Bütün mesajları okumadım ama Çift Kayıtın sebebi Telefonunuzdaki Whatsapp uygulaması olabilir. Özellikle bu Android lolipop mudur bonibon mudur nedirse o güncellemeden sonra oldu.

Listeleme yaparken kaynak filtrelemesi yapmalısınız. Nasıl olacak derseniz wondershare tarzı uygulamalara bakın orada kaynak listelerinde google, whatsapp vs. vs. ile beraber vnd.contacts.blabla tarzı birşey yazar işte o gerçek telefon hafızasıdır.
Kullanıcı avatarı
dogan
Üye
Mesajlar: 173
Kayıt: 17 Eki 2014 10:11

Re: Telefon rehberini okuma

Mesaj gönderen dogan »

Faydalı bir konu emeği geçen herkese teşekkürler...
Cevapla