telefon rehberini okuma

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Kullanıcı avatarı
mudipasa
Üye
Mesajlar: 169
Kayıt: 13 Tem 2004 02:25
Konum: Batman

telefon rehberini okuma

Mesaj gönderen mudipasa »

S.A. Arkadaşlar,
Bir blog sitesinde android telefon rehber okuma örnek kodlarını gördüm
[code]USES Androidapi.JNI.GraphicsContentViewText,
FMX.Helpers.Android,
Androidapi.JNI.Provider,
Androidapi.JNI.JavaTypes;

function RehberOku: TStringList;
var
cContacts,
cContactsPhone : JCursor;
iNumaraSayisi : Integer;
iIdx : Int64;
strGorunenAd,
strTelNo,
strKisiID : string;
begin
Result := TStringList.Create;
cContacts := SharedActivity.getContentResolver.query( TJContactsContract_Contacts.JavaClass.CONTENT_URI, nil, nil, nil, nil );
if (cContacts.getCount > 0) then
begin
while (cContacts.moveToNext) do
begin
iIdx := cContacts.getLong( cContacts.getColumnIndex(StringToJString('_ID')) );
strGorunenAd := JStringToString(cContacts.getString(cContacts.getColumnIndex(StringToJString('DISPLAY_NAME'))));
iNumaraSayisi := cContacts.getInt(cContacts.getColumnIndex(StringToJString('HAS_PHONE_NUMBER')));
if (iNumaraSayisi > 0) then
begin
cContactsPhone := SharedActivity.getContentResolver.query(TJCommonDataKinds_Phone.JavaClass.CONTENT_URI, nil,StringToJString('CONTACT_ID = ' + IntToStr(iIdx)),nil, nil);
while (cContactsPhone.moveToNext) do
begin
strTelNo := JStringToString(cContactsPhone.getString(cContactsPhone.getColumnIndex(StringToJString('DATA1'))));
strKisiID := JStringToString(cContactsPhone.getString(cContactsPhone.getColumnIndex(StringToJString('CONTACT_ID'))));
Result.Add(strGorunenAd + ': ' + strTelNo);
end;
cContactsPhone.close;
end;
end;
end;
cContacts.close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.AddStrings( RehberOku() );
end;[/code]

Çalıştırdığımda telefon ekranımda java hatası veriyor;
java.lang.SecurityException:
Permission Denial:reading
com.android.providers.contacts.ContactsProvide2 uri content://
com.android.contacts/contacts
from pid=8394, uid=10239 requires
android.permission.READ_CONTACTS, or grantUriPermission()

şeklinde bir hata. Telefon rehberini okuma ile ilgili başka yöntem bulamadım. Hatayı da çözemedim :(
Yardımcı olursanız sevinirim..

Kod: Tümünü seç

www.muratdişikırık.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: telefon rehberini okuma

Mesaj gönderen SimaWB »

Hata mesajına göre izinlerle alakalı bir sıkıntınız var.
AndroidManifest dosyası içinde READ_CONTACTS izninin olduğundan emin olun.

Kod: Tümünü seç

<uses-permission android:name="android.permission.READ_CONTACTS" />
There's no place like 127.0.0.1
Kullanıcı avatarı
mudipasa
Üye
Mesajlar: 169
Kayıt: 13 Tem 2004 02:25
Konum: Batman

Re: telefon rehberini okuma

Mesaj gönderen mudipasa »

:bravo: Çok teşekkür ederim. Android konusunda acemi olduğumuz nereden belli :) delphi dedik hemen saldırdık ama birde işin başka tarafları varmış. delphi dışında diğer konularla ilgili mesela sizin çözümünüz gibi kaynak (olursa tükrçe) nereden bulabiliriz.

Kod: Tümünü seç

www.muratdişikırık.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: telefon rehberini okuma

Mesaj gönderen SimaWB »

Maalesef Türkçe kaynak bulmak oldukça zor. Firemonkey henüz çok yeni sayılır. O yüzden kısa vadede, komple bir Türkçe kaynak (kitap) çıkacağını zannetmiyorum.
Bence İngilizce kaynaklardan istifade edebilecek kadar İngilizce şart :(
There's no place like 127.0.0.1
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: telefon rehberini okuma

Mesaj gönderen barisatalay »

Kaynak: http://www.delphiturkiye.com/ :)

Siz yeterki konu olarak açın cevaplanmayan soru kolay kolay olmayacaktır.
thexxi
Üye
Mesajlar: 5
Kayıt: 10 Mar 2015 12:56

Re: telefon rehberini okuma

Mesaj gönderen thexxi »

Peki şimdi bu okuduğumuz rehberi yedek aldık(bir dosya olarak telefona yedekledik) diyelim ..... boş bir telefona nasıl kayıt edebiliriz..? (dosyadan rehbere aktarımı nasıl gerçekleştirebiliriz?)
powertrk
Üye
Mesajlar: 27
Kayıt: 01 Eki 2008 12:02

Re: telefon rehberini okuma

Mesaj gönderen powertrk »

Merhaba Arkadaşlar,

Belli bir numara sorgulamak istersek nasıl bir yol izlemeliyiz.

Yada aşağıdaki bağlantıda java tarafında çözümü anlatılmış.
Bu kodu delphiye nasıl uyarlarız.

http://stackoverflow.com/questions/2572 ... 1#25722651
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: telefon rehberini okuma

Mesaj gönderen barisatalay »

powertrk yazdı:Merhaba Arkadaşlar,

Belli bir numara sorgulamak istersek nasıl bir yol izlemeliyiz.

Yada aşağıdaki bağlantıda java tarafında çözümü anlatılmış.
Bu kodu delphiye nasıl uyarlarız.

http://stackoverflow.com/questions/2572 ... 1#25722651
Eğer yukarıdaki örneği dikkatli incelerseniz bir cursor nesnesi yardımı ile telefon listesindeki bütün numaraları dönüyor.

basit bir işlem olarak if strTelNo <> '+9052585236' then örneğindeki gibi benzer bir sorgu eklerseniz işinizi rahatça görür.
powertrk
Üye
Mesajlar: 27
Kayıt: 01 Eki 2008 12:02

Re: telefon rehberini okuma

Mesaj gönderen powertrk »

Evet haklısınız. O şekilde yapılabilirliğini biliyorum ve denemelerim oldu.
Fakat rehber kayıt sayısı çok olan cihazlarda örneğin 1500 ve üzeri 40 sn. üzeri bir zaman alıyor. Bu da katlanılabilir bir durum değil.
Bu durumdan ötürü direk numara yada isim bazlı sorgulama yapılırsa bu sorun aşılacaktır diye düşünüyorum.
Bazı tip dönüşümleri konusunda bilgim malesef yok. Bu konuda yorumlarınızı ve varsa java bilginiz önceki mesajımdaki kodu çevirmenizi rica ediyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: telefon rehberini okuma

Mesaj gönderen mrmarman »

powertrk yazdı:Merhaba Arkadaşlar,

Belli bir numara sorgulamak istersek nasıl bir yol izlemeliyiz.

Yada aşağıdaki bağlantıda java tarafında çözümü anlatılmış.
Bu kodu delphiye nasıl uyarlarız.

http://stackoverflow.com/questions/2572 ... 1#25722651
Önceki bu mesajındaki JAVA kodunun çevrimi zaten bu başlıkta paylaşılan ile aynı.
JAVA'daki örnekte de buradaki örnekte de aynı şekilde ilk contact'a konumlandıktan sonra contact.moveToNext() ile döngü kurulmuş.

Bu JAVA örneğin 3 saniye içinde sonuç getiriyor. Nasıl mı ? Sadece contact ismini getiriyor. Telefon numarasını değil... Bu Delphi kodunu bu şekilde revize edince bendeki içerik de 3 saniyede geldi. :idea:

Direkt ListBox veya ListView'e atmayı deniyor olunması dahi bu yavaşlığın sebebi olabilir. BeginUpdate, EndUpdate ile VCL'nin görsel yanını bloke edip, akışın sonunda yeniden blokajı kaldırmak gibi aklıselim yaklaşımlar performans artışı sağlar.

Bize uyguladığınız kodu yazmazsanız bilemeyiz ki neden gecikme oluyor ?! Değil mi kardeşim...

Yukarıdaki kod bendeki 500 kişi için ( Galaxy S3 ) ile tam 10 saniyede getirdi. Zaten projenin optimizasyonu sana ait. Bir defa listeyi aldığında kendi SQLITE veritabanını oluşturur oradan hızlı arama yaptırırsın. Ola ki yeni rehber ekleme işlemi yapıldı o zaman tüm rehberi bir defalık daha taratırsın.

Programcılığın, kurduğun mantıkla ayrıcalık kazanır.

Delphi XE7 kodunu ( yukarıdaki ile aynı ama daha düzenli olarak [code.] bloğunda vereyim ve aynı paydada buluşalım diye yeniden veriyorum )

Kod: Tümünü seç

USES  Androidapi.JNI.GraphicsContentViewText,
      FMX.Helpers.Android,
      Androidapi.JNI.Provider,
      Androidapi.JNI.JavaTypes,
      Androidapi.Helpers;

function RehberOku: TStringList;
var
  cContacts,
  cContactsPhone : JCursor;
  iNumaraSayisi  : Integer;
  iIdx           : Int64;
  strGorunenAd,
  strTelNo,
  strKisiID      : string;
begin
  Result    := TStringList.Create;
  cContacts := SharedActivity.getContentResolver.query( TJContactsContract_Contacts.JavaClass.CONTENT_URI, nil, nil, nil, nil );
  if (cContacts.getCount > 0) then
  begin
    while (cContacts.moveToNext) do
    begin
      iIdx          := cContacts.getLong( cContacts.getColumnIndex(StringToJString('_ID')) );
      strGorunenAd  := JStringToString(cContacts.getString(cContacts.getColumnIndex(StringToJString('DISPLAY_NAME'))));
      iNumaraSayisi := cContacts.getInt(cContacts.getColumnIndex(StringToJString('HAS_PHONE_NUMBER')));
      if (iNumaraSayisi > 0) then
      begin
        cContactsPhone := SharedActivity.getContentResolver.query(TJCommonDataKinds_Phone.JavaClass.CONTENT_URI, nil,StringToJString('CONTACT_ID = ' + IntToStr(iIdx)),nil, nil);
        while (cContactsPhone.moveToNext) do
        begin
          strTelNo   := JStringToString(cContactsPhone.getString(cContactsPhone.getColumnIndex(StringToJString('DATA1'))));
          strKisiID  := JStringToString(cContactsPhone.getString(cContactsPhone.getColumnIndex(StringToJString('CONTACT_ID'))));
          Result.Add(strGorunenAd + ': ' + strTelNo);
        end;
        cContactsPhone.close;
      end;
      Application.ProcessMessages;
    end; // While
  end;
  cContacts.close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ListBox1.BeginUpdate;
   ListBox1.Items.AddStrings( RehberOku() );
   ListBox1.EndUpdate;
end;
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: telefon rehberini okuma

Mesaj gönderen mrmarman »

Numara ya da İsim bazlı sorgulama deyince aklıma takıldı. Biraz araştırınca buldum. Paylaşayım. :idea:

USES'a TJavaObjectArray<JString> için ekstradan Androidapi.JNIBridge eklemek gerekiyor.

Kod: Tümünü seç

function GetContact (Name: string; Number: string) : TStringList;
var
  cursorContactsPhone: JCursor;
  Typo1,
  Typo2  : string;
  FindBy : JString;
  ToFind : TJavaObjectArray<JString>;    // Androidapi.JNIBridge
  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;
Denedim çalışıyor. Kullanımında parametre olarak isim veya numara veriyorsun

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
begin
  With GetContact('Muharrem', '') do
  begin
    ListBox1.Items.Text := Text;
    Free;
  end;
end;
Çok hızlı sonuç döndürüyor....
Resim
Resim ....Resim
powertrk
Üye
Mesajlar: 27
Kayıt: 01 Eki 2008 12:02

Re: telefon rehberini okuma

Mesaj gönderen powertrk »

Muharrem Bey zihninize sağlık teşekkür ederim.
Makul derecede hızlı bir çözüm olmuş.
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: telefon rehberini okuma

Mesaj gönderen Dostk »

Merhabalar;


Rehberdeki numaraları listview almak için paylaşılan bu kodları kullandım, telefon rehberinde 180 kişi ekli ve yaklaşık 10 - 15 saniyede rehberi listeleme yapabiliyorum, fakat yapmaya çalıştığım projenin benzerlerini play stroden indirip test edince açıkçası uttandım, nedeni isse 1 - 2 saniyede rehber listelendi. bu sorun acaba delhiden mi kaynaklıdır yoksa kodlarda mı sorun var????


Not: Amacım kimseyi eleştirmek veya saldırmak değil sadece durumu anlamaya çalışıyorum; Emeği geçen herkese sonsuz teşekkürler...
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;
Birkaç gün daha sabredin. Delphi 10.1 sürümünde rehbere doğrudan erişim için TAddressBook nesnesi ekleniyor.
Kullanıcı avatarı
hido
Üye
Mesajlar: 268
Kayıt: 29 Mar 2014 04:32

Re: telefon rehberini okuma

Mesaj gönderen hido »

Dostk yazdı:Merhabalar;


Rehberdeki numaraları listview almak için paylaşılan bu kodları kullandım, telefon rehberinde 180 kişi ekli ve yaklaşık 10 - 15 saniyede rehberi listeleme yapabiliyorum, fakat yapmaya çalıştığım projenin benzerlerini play stroden indirip test edince açıkçası uttandım, nedeni isse 1 - 2 saniyede rehber listelendi. bu sorun acaba delhiden mi kaynaklıdır yoksa kodlarda mı sorun var????


Not: Amacım kimseyi eleştirmek veya saldırmak değil sadece durumu anlamaya çalışıyorum; Emeği geçen herkese sonsuz teşekkürler...
fesiharslan yazdı:Merhaba;
Birkaç gün daha sabredin. Delphi 10.1 sürümünde rehbere doğrudan erişim için TAddressBook nesnesi ekleniyor.

Selam;
TAddressBook için ne zaman günceleme geleçeğini tam olarak biliyormusunuz? çünki bu kodlarla rehberi listelemek tam bir kabus...
Cevapla