스마트폰앱

오늘:
494
어제:
2,183
전체:
2,858,177

고객센타 : 070-7752-2000
팩스 : 070-7752-2001
휴대폰 : 010-9513-0019
email : voipkorea@yahoo.co.kr

국민은행
(주)제이에스솔루션
047101-04-155519

Flag Counter
■ 무료 : 유선 집전화 휴대폰 ( 한국 미국 중국 카나다) ↔ (국내 해외 여행자 상사 주재원 유학생) / 가입무 무제한무료■

http://stackoverflow.com/questions/1721279/how-to-read-contacts-on-android-2-0

 

 

I'm working on Android 2.0 and am trying to receive a list of all contacts.

Since android.provider.Contacts.People is deprecated, I have to use android.provider.ContactsContract, But I can't find a proper example of how to use it (ex: retrieve a list of all contacts on the phonebook).

Anyone knows where to find such an example?

share|improve this question
I'd really like to know this as well. I can only find examples on the old method. – Andrew Koester Nov 12 '09 at 21:22
feedback

7 Answers

First, ensure that you have added

<uses-permission android:name="android.permission.READ_CONTACTS"/> 

to your AndroidManifest.xml file, then you can loop through your phone contacts like this:

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);  
while (cursor.moveToNext()) {  
   
String contactId = cursor.getString(cursor.getColumnIndex(  
   
ContactsContract.Contacts._ID));  
   
String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));  
   
if (Boolean.parseBoolean(hasPhone)) {  
     
// You know it has a number so now query it like this 
     
Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);  
     
while (phones.moveToNext()) {  
         
String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));                  
     
}  
      phones
.close();  
   
} 
 
   
Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null);  
   
while (emails.moveToNext()) {  
     
// This would allow you get several email addresses  
     
String emailAddress = emails.getString(  
      emails
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));  
   
}  
   emails
.close(); 
} 
cursor
.close();  

Additionally, you can loop through your contacts and simply get the name and phone number like this:

Cursor people = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
 
while(people.moveToNext()) { 
   
int nameFieldColumnIndex = people.getColumnIndex(PhoneLookup.DISPLAY_NAME); 
   
String contact = people.getString(nameFieldColumnIndex); 
   
int numberFieldColumnIndex = people.getColumnIndex(PhoneLookup.NUMBER); 
   
String number = people.getString(numberFieldColumnIndex); 
} 
 
people
.close(); 

Furthermore, if you need to get things like notes from a contact then you will need to use a different URI, like the following (feel free to use this method):

private String getNote(long contactId) {  
   
String note = null;  
   
String[] columns = new String[] { ContactsContract.CommonDataKinds.Note.NOTE };  
   
String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";  
   
String[] whereParameters = new String[]{Long.toString(contactId), ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};  
   
Cursor contacts = getContentResolver().query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null);  
   
if (contacts.moveToFirst()) {  
      rv
= contacts.getString(0);  
   
}  
   contacts
.close();  
   
return note;  
}  

Notice this time I used not only the contact id but the mime type for the query.

share|improve this answer
That was perfect Javier, thanks for this, I had to adapt it a bit for my purpose (check if a contact is in to avoid adding again). Here is my code if you want to add it to your post : String[] contactNameColumn = { ContactsContract.Contacts.DISPLAY_NAME }; Cursor checkContactInDatabase = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, contactNameColumn, ContactsContract.Contacts.DISPLAY_NAME + "=" + "'" + name + "'", null, null); if (checkContactInDatabase.moveToFirst()) { int nameFieldColumnIndex = checkContactInDatabase.getColumnIndex(PhoneLookup.DISPLAY_NAME); – Sephy May 28 '10 at 9:40
String contact = checkContactInDatabase.getString(nameFieldColumnIndex); Toast.makeText(Contact.this, contact + " " + getString(R.string.alreadySaved), Toast.LENGTH_SHORT).show(); } else { Intent i = new Intent(Intent.ACTION_INSERT_OR_EDIT); i.setType(Contacts.CONTENT_ITEM_TYPE); i.putExtra(Insert.NAME, name); i.putExtra(Insert.PHONE, phone); i.putExtra(Insert.COMPANY, companie); i.putExtra(Insert.POSTAL, adresse); startActivity(i); } checkContactInDatabase.close(); – Sephy May 28 '10 at 9:40
2  
Hi, I am getting false always at this statement if (Boolean.parseBoolean(hasPhone)); even though hasPhone has value = "1" – Vamsi Nov 29 '10 at 7:22
Sephy, thanks for your additions. Vamsi, this is pretty old code at this point. Android's access to the contacts provider radically changed after 2.1 if I'm not mistaken. – Javier Figueroa Dec 16 '10 at 16:27
1  
Instead of emails.getColumnIndex(ContactsContract.CommonDataKinds.CommonDataColumns.DATA)); you can also use emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DA‌​TA)); – erdomester May 22 '11 at 8:38
show 1 more comment
feedback

Great to see some useful info, it is frustrating how poorly this important topic is covered by docs and such. After too much hacking about I thought I would share a little code also. The following code is a little prettier and get the same thing done more efficiently.

Uri contactUri = ContactsContract.Contacts.CONTENT_URI; 
 
   
String[] PROJECTION = new String[] { 
 
           
ContactsContract.Contacts._ID, 
 
           
ContactsContract.Contacts.DISPLAY_NAME, 
 
           
ContactsContract.Contacts.HAS_PHONE_NUMBER, 
 
   
}; 
 
String SELECTION = ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'"; 
 
Cursor contacts = managedQuery(contactUri, PROJECTION, SELECTION, null, null ); 

The above chunk of code returns a Cursor that points to the resulting query that only contains those rows that have a phone number. This is nice since you typically have many contacts without numbers. Furthermore, the PROJECTION limits the amount of data that is returned.

String key, value, phoneNumber;  
 
Hashtable contactPhoneInfo = new Hashtable<String, String>(); 
 
Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;  
 
String [] PHONES_PROJECTION = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }; 
 
String PHONE_SELECTION = null;  
 
        contacts
.moveToFirst(); 
 
       
do{ 
 
         
long contactId = contacts.getLong(idColumnIndex);  
 
         PHONE_SELECTION
= ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId;  
 
         
Cursor phones = managedQuery(phoneUri, 
           PHONES_PROJECTION
, 
           
null,  
           
null, 
                   
ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY + " DESC"); 
 
 
         phones
.moveToFirst();  
 
         key
= phones.getString(0).replaceAll("\\D", ""); 
 
         value
= contacts.getString(nameColumnIndex);  
 
         contactPhoneInfo
.put(key, value);  
 
       
}while(contacts.moveToNext());  
 
        contacts
.close();  
} 

The above chunk gets the phone number associated with each contact id that has a phone number. I store all the info in a hash table and with a key value of the phone number. I stripped the phone number of all none digit info also. For some reason even though ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER is valid if you include that in the projection argument it breaks the query, I don't know why and it is frustrating that it does.

The second part of the code above is too slow, all the query calls just bog everything down. The following code is much faster. Just grab all the rows for the phone content and use the contact_ids to sort the data you want.

Cursor phones = managedQuery(phoneUri, 
                PHONES_PROJECTION
, 
                PHONE_SELECTION
,  
               
null, 
               
ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY + " DESC"); 
 
contacts
.moveToFirst(); 
 
       
do{ 
 
            value
= "";  
 
            key
= contacts.getString(idColumnIndex);  
 
            contactPhoneInfo
.put(key, value); 
 
       
}while(contacts.moveToNext()); 
 
phones
.moveToFirst(); 
 
       
Set keySet = contactPhoneInfo.keySet();  
 
        idColumnIndex
= phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID); 
 
       
int numColumnIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);  
 
       
do{ 
 
            key
= phones.getString(idColumnIndex);   
 
           
if(keySet.contains(key)){ 
 
                value
= phones.getString(numColumnIndex).replaceAll("\\D", "");  
 
                contactPhoneInfo
.put(key, value);  
 
           
} 
 
 
       
}while(phones.moveToNext());  

You end up with a hashtable with all the info you want in it. Of course you could put whatever info you want into the data structure. The second way of doing it is much much faster.

share|improve this answer
2  
If you just want some of the associated contact's info, you could also just use the implicit-join columns (like ContactsContract.Data.DISPLAY_NAME) in your projection; then you wouldn't have to do a messy simulated join in Java. – Yoni Samlan Dec 17 '10 at 16:28
feedback

I think it is important to have the code from this URL http://coderzheaven.com/2011/06/get-all-details-from-contacts-in-android/ on StackOverflow cause at times links like that go down.

 public void readContacts(){ 
         
ContentResolver cr = getContentResolver(); 
         
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
               
null, null, null, null); 
 
         
if (cur.getCount() > 0) { 
           
while (cur.moveToNext()) { 
               
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
               
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
               
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
                   
System.out.println("name : " + name + ", ID : " + id); 
 
                   
// get the phone number 
                   
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, 
                                           
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
                                           
new String[]{id}, null); 
                   
while (pCur.moveToNext()) { 
                         
String phone = pCur.getString( 
                                 pCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
                         
System.out.println("phone" + phone); 
                   
} 
                    pCur
.close(); 
 
                   
// get email and type 
 
                   
Cursor emailCur = cr.query( 
                           
ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
                           
null, 
                           
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
                           
new String[]{id}, null); 
                   
while (emailCur.moveToNext()) { 
                       
// This would allow you get several email addresses 
                           
// if the email addresses were stored in an array 
                       
String email = emailCur.getString( 
                                      emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
                       
String emailType = emailCur.getString( 
                                      emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
 
                     
System.out.println("Email " + email + " Email Type : " + emailType); 
                   
} 
                    emailCur
.close(); 
 
                   
// Get note....... 
                   
String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
                   
String[] noteWhereParams = new String[]{id, 
                   
ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; 
                           
Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, noteWhere, noteWhereParams, null); 
                   
if (noteCur.moveToFirst()) { 
                       
String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE)); 
                     
System.out.println("Note " + note); 
                   
} 
                    noteCur
.close(); 
 
                   
//Get Postal Address.... 
 
                   
String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
                   
String[] addrWhereParams = new String[]{id, 
                       
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}; 
//               Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI, 
//                       null, null, null, null); 
               
Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI, 
                       
null, addrWhere, addrWhereParams, null); 
 
                   
while(addrCur.moveToNext()) { 
                       
String poBox = addrCur.getString( 
                                     addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX)); 
                       
String street = addrCur.getString( 
                                     addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 
                       
String city = addrCur.getString( 
                                     addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 
                       
String state = addrCur.getString( 
                                     addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 
                       
String postalCode = addrCur.getString( 
                                     addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 
                       
String country = addrCur.getString( 
                                     addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 
                       
String type = addrCur.getString( 
                                     addrCur
.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); 
 
                       
// Do something with these.... 
 
                   
} 
                    addrCur
.close(); 
 
                   
// Get Instant Messenger......... 
                   
String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
                   
String[] imWhereParams = new String[]{id, 
                       
ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; 
                   
Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI, 
                           
null, imWhere, imWhereParams, null); 
                   
if (imCur.moveToFirst()) { 
                       
String imName = imCur.getString( 
                                 imCur
.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)); 
                       
String imType; 
                        imType
= imCur.getString( 
                                 imCur
.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE)); 
                   
} 
                    imCur
.close(); 
 
                   
// Get Organizations......... 
 
                   
String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
                   
String[] orgWhereParams = new String[]{id, 
                       
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}; 
                   
Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI, 
                               
null, orgWhere, orgWhereParams, null); 
                   
if (orgCur.moveToFirst()) { 
                       
String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)); 
                       
String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)); 
                   
} 
                    orgCur
.close(); 
               
} 
           
} 
       
} 
   
} 

emphasized text

share|improve this answer
1  
note that this code might have performance issues. see question: stackoverflow.com/questions/10921109/… – oshai Jun 7 at 6:40
feedback

Just want to add, when you are retrieving the contacts you might get a lot of "garbage" contacts - for example some email addresses that a user has at some point send an email to, but are not aggregated... If you want only the contacts visible to the user, as in the Androids own contacts application you need to restrict the selection to only IN_VISIBLE_GROUP.

    String where = ContactsContract.Contacts.IN_VISIBLE_GROUP + "= ? "; 
   
String[] selectionArgs = new String[] { "1" }; 
share|improve this answer
Excellent addition. – javaMe Apr 28 at 22:15
Thank you, thank you, thank you. – Steelight Aug 28 at 8:47
feedback

This part wouldn't work for me:

 while (phones.moveToNext()) {  
     
String phoneNumber = phones.getString(  
       phones
.getColumnIndex(  
         
ContactsContract.CommonDataKinds.Phone.NUMBER));                  
   
}  

If I use this, though, it does:

 while (phones.moveToNext()) {  
                                 
String pdata = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA)); 
                                 
Log.v("DATA",pdata); 
} 
share|improve this answer
feedback

You can use "ContactManager" example from android developer's site (OR) Go to the location where you have set the path to download android-sdk in your system. In android-sdk-mac_x86/samples/android-10 folder, you can see "ContactManager" example.

I have tried using this example, worked well in my application.

share|improve this answer
feedback

Put this ....

Cursor phones =  
 
    getContentResolver
().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); 
               
while (phones.moveToNext()) 
               
{ 
               
String Name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) 
               
String Number=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));} 

Let me know if any issue.

share|improve this answer
조회 수 :
13678
등록일 :
2012.10.14
09:50:17 (*.160.42.233)
엮인글 :
http://webs.co.kr/index.php?document_srl=13567&act=trackback&key=784
게시글 주소 :
http://webs.co.kr/index.php?document_srl=13567
List of Articles
번호 제목 글쓴이 날짜 조회 수
65 Package org.linphone.core Description admin 2017-10-22 241
64 Sqlite detail easy tutorial. admin 2017-09-09 548
63 Change package name Linphone Android admin 2017-08-25 656
62 Liblinphone - import Linphone library in Android Studio 2017 admin 2017-08-25 647
61 I am able to build the limphone on mac by follow the steps describe here admin 2017-08-25 635
60 To build liblinphone for Android, you must COMPILATION INSTRUCTIONS admin 2017-08-25 630
59 sipdroid source code admin 2017-08-08 739
58 안드로이드 주소록 전체가져오기 이름만가져오기 사진가져오기 코드 admin 2015-04-13 6525
57 the sipdroid Research Miscellaneous admin 2015-03-26 3151
56 HSS070 English Korean 무료 국제전화 미국 중국 카나다 무료 통화 제공 admin 2014-12-28 4582
55 Softphones admin 2014-09-20 4847
54 /xxxxx/gen already exists but is not a source folder. Convert to a source folder or rename it. admin 2014-09-03 5290
53 CSIPSimple building Rebuilding Detail on Eclips Good All is heare perfect admin 2014-08-15 5227
52 Improving QoE of SIP-based Automated Voice Interaction in Mobile Networks file admin 2014-03-20 6023
51 speex support in android admin 2014-03-19 6239
50 voxmobile Source and how to build admin 2014-02-18 6643
49 PJSIP hung the phone constantly corrected the problem admin 2014-02-09 7086
48 Csipsimple code rebuilding source sip 통신 Call Mechanism admin 2014-02-09 21720
47 Csipsimple code rebuilding source sip 통신 technical interviewer admin 2014-02-09 7001
46 Csipsimple code rebuilding source 주요인터페이스분석 admin 2014-02-09 40626
45 Csipsimple code rebuilding source 다운로드 구성 csipsimple 소스 프로젝트 admin 2014-02-09 8084
44 Android DialogFragment Tutorial admin 2014-02-09 7448
43 Creating a fullscreen DialogFragment with a custom background admin 2014-02-09 9920
42 [Android API] 네트워크 상태 체크하기 admin 2013-12-19 8788
41 [안드로이드] 네트워크 연결 상태 체크 함수. admin 2013-12-19 7987
40 안드로이드 인터넷연결체크 ( 3g/lte/wifi ) 메서드 admin 2013-12-19 14485
39 Android Get Phone Contacts details with Contact Image admin 2013-12-15 7314
38 안드로이드 커스텀 타이틀바 How to add custom title bar to android application admin 2013-10-02 9755
37 How to create a custom title bar admin 2013-07-15 9994
36 Rotary Dialer clip art admin 2013-04-20 17610
35 Java 프로그램 실행화일 만들기 : Launch4j admin 2013-02-21 10717
34 java network programming source code, learning socket programming admin 2012-12-04 10701
33 2X Client Configuration | Android Remote Desktop 안드로이드 PC 리모트 데스크탑 admin 2012-12-02 12515
32 WIFI 3G 인터넷 연결 실시간 체크 소스코드 Broadcast Receiver 사용 (Adnroid) admin 2012-10-31 16994
31 통신사별 와이파이 비밀번호 admin 2012-10-31 14981
30 팁, wifi 패스워드 모음집 password admin 2012-10-21 11082
29 Android User Session Management using Shared Preferences admin 2012-10-16 32865
28 Unicode Tables v4 admin 2012-10-16 23346
27 HTML Codes admin 2012-10-16 10037
26 IBM Scan Codes EBCDIC Codes admin 2012-10-16 12241
25 ASCII Table and Description admin 2012-10-16 11512
24 How to Show Alert Dialog in Android (간단하고 쉬운설명) admin 2012-10-15 22671
» How to read contacts on Android 2.0 admin 2012-10-14 13678
22 WIFI 3G 인터넷 연결 체크 소스코드 직접 사용한 코드 android admin 2012-10-14 15532
21 Android Detect Internet Connection Status admin 2012-10-12 21098
20 JAVA + SSL (server and client examples) admin 2012-10-07 22575
19 Querying The Android Contact Database admin 2012-09-30 10920
18 Manage Contacts android admin 2012-09-30 12889
17 Android Contacts API 2 example admin 2012-09-30 13996
16 Android 2.0 주소록 동기화 기능 admin 2012-09-30 39288
15 안드로이드용 앱 개발 마켓등록 까지 해본거 샘플 무료국제전화 앱 FreeDialer admin 2012-09-27 14984
14 아이폰 IPhone 앱 개발 기본 admin 2012-09-27 11608
13 [안드로이드/개발] Intent admin 2012-09-23 18125
12 안드로이드 타이머 절적한 설명과 간단한소스코드 등 안드로이드 프로그램 설명 깔끔 admin 2012-09-23 28920
11 google voice source code admin 2012-09-22 10941
10 [안드로이드] 서버/클라이언트 소켓(Socket) 통신하기 admin 2012-09-20 21197
9 FreeDial 무료국제전화는 프리미엄 국제전화 다이렉트 회선사용 admin 2012-09-20 11993
8 Android SQlite 사용 admin 2012-09-04 11865
7 안드로이드마켓에 앱 등록하는 순서 admin 2012-08-19 42779
6 전화관련 안드로이드함수 admin 2012-08-18 15607
5 자바 ,이클립스,Android SDK, ADT 설치하여 무료국제전화 다이얼러를 만들어봅시다. admin 2012-08-06 16118
4 아이폰용 무료국제전화용 무료 다이얼러 Speedydialer 설치및 사용방법 file admin 2012-07-14 11457
3 접속번호 + 상대방번호 # 를 주소록에 전화번호로 저장하여 사용하면 편리하다 admin 2012-06-17 13433
2 App Store - ILD Dialer admin 2012-06-17 10004
1 한국휴대폰에서 미국 중국 카나다 무료 국제전화 서비스 admin 2012-04-27 10358