telefon rehberini okuma
telefon rehberini okuma
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..
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
Re: telefon rehberini okuma
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.
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
Re: telefon rehberini okuma
Ç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
Re: telefon rehberini okuma
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
Bence İngilizce kaynaklardan istifade edebilecek kadar İngilizce şart
There's no place like 127.0.0.1
- barisatalay
- Üye
- Mesajlar: 398
- Kayıt: 02 Nis 2013 05:43
- İletişim:
Re: telefon rehberini okuma
Kaynak: http://www.delphiturkiye.com/
Siz yeterki konu olarak açın cevaplanmayan soru kolay kolay olmayacaktır.
Siz yeterki konu olarak açın cevaplanmayan soru kolay kolay olmayacaktır.
Yeni bloğum: http://brsatalay.blogspot.com.tr/
Re: telefon rehberini okuma
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?)
Re: telefon rehberini okuma
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
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
- barisatalay
- Üye
- Mesajlar: 398
- Kayıt: 02 Nis 2013 05:43
- İletişim:
Re: telefon rehberini okuma
Eğer yukarıdaki örneği dikkatli incelerseniz bir cursor nesnesi yardımı ile telefon listesindeki bütün numaraları dönüyor.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
basit bir işlem olarak if strTelNo <> '+9052585236' then örneğindeki gibi benzer bir sorgu eklerseniz işinizi rahatça görür.
Yeni bloğum: http://brsatalay.blogspot.com.tr/
Re: telefon rehberini okuma
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.
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.
Re: telefon rehberini okuma
Önceki bu mesajındaki JAVA kodunun çevrimi zaten bu başlıkta paylaşılan ile aynı.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
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.
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;
Re: telefon rehberini okuma
Numara ya da İsim bazlı sorgulama deyince aklıma takıldı. Biraz araştırınca buldum. Paylaşayım.
USES'a TJavaObjectArray<JString> için ekstradan Androidapi.JNIBridge eklemek gerekiyor.
Denedim çalışıyor. Kullanımında parametre olarak isim veya numara veriyorsun
Çok hızlı sonuç döndürüyor....
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;
Kod: Tümünü seç
procedure TForm1.Button3Click(Sender: TObject);
begin
With GetContact('Muharrem', '') do
begin
ListBox1.Items.Text := Text;
Free;
end;
end;
Re: telefon rehberini okuma
Muharrem Bey zihninize sağlık teşekkür ederim.
Makul derecede hızlı bir çözüm olmuş.
Makul derecede hızlı bir çözüm olmuş.
Re: telefon rehberini okuma
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...
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
- Üye
- Mesajlar: 591
- Kayıt: 20 Eki 2006 11:37
- Konum: Erzurum
- İletişim:
Re: telefon rehberini okuma
Merhaba;
Birkaç gün daha sabredin. Delphi 10.1 sürümünde rehbere doğrudan erişim için TAddressBook nesnesi ekleniyor.
Birkaç gün daha sabredin. Delphi 10.1 sürümünde rehbere doğrudan erişim için TAddressBook nesnesi ekleniyor.
Re: telefon rehberini okuma
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...