ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Tip] 안드로이드 사용자 주소록 리스트 가져오기
    Mhwan's Develope/Android 2016. 10. 27. 03:52

    앱 내에서 사용자 주소록 리스트를 가져오는 방법으로 연락처에 지정한 사진까지 가져올 수 있다.

    (가져오는 데이터 : 저장된 이름, 저장된 번호, 사진(photo_id, person_id))


    이것은 READ_CONTACTS라는 권한이 필요하므로 매니페스트에 적는다. (마쉬멜로우 이상일 경우 권한을 허락받도록 요청 받게 만들어줘야한다.)

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


    먼저 가져올 사용자의 유저 클래스를 만든다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    //id 값은 리스트뷰의 position 값
    //연락처의 사진을 가져오기위해선 photo_id, person_id 필요
    public class ContactItem implements Serializable{
        private String user_phNumber, user_Name;
        private long photo_id=0, person_id=0;
        private int id;
     
        public ContactItem(){}
        public long getPhoto_id(){
            return photo_id;
        }
        public long getPerson_id(){
            return person_id;
        }
        public void setPhoto_id(long id){
            this.photo_id = id;
        }
        public void setPerson_id(long id){
            this.person_id = id;
        }
        
        public String getUser_phNumber(){
            return user_phNumber;
        }
        public String getUser_Name(){
            return user_Name;
        }
        public void setId(int id){
            this.id = id;
        }
        public int getId(){
            return id;
        }
        public void setUser_phNumber(String string){
            this.user_phNumber = string;
        }
        
        public void setUser_Name(String string){
            this.user_Name = string;
        }
        @Override
        public String toString() {
            return this.user_phNumber;
        }
     
        @Override
        public int hashCode() {
            return getPhNumberChanged().hashCode();
        }
        public String getPhNumberChanged(){
            return user_phNumber.replace("-""");
        }
     
        @Override
        public boolean equals(Object o) {
            if (o instanceof ContactItem)
                return getPhNumberChanged().equals(((ContactItem) o).getPhNumberChanged());
     
            return false;
        }
    }
    cs


    아래는 ArrayList형태로 연락처를 가져오는 코드이다

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public ArrayList<ContactItem> getContactList() {
     
            Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
            String[] projection = new String[]{
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                    ContactsContract.Contacts.PHOTO_ID,
                    ContactsContract.Contacts._ID
            };
            String[] selectionArgs = null;
            String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                    + " COLLATE LOCALIZED ASC";
            Cursor cursor = AppContext.getContext().getContentResolver().query(uri, projection, null,
                    selectionArgs, sortOrder);
            LinkedHashSet<ContactItem> hashlist = new LinkedHashSet<>();
            if (cursor.moveToFirst()) {
                do {
                    long photo_id = cursor.getLong(2);
                    long person_id = cursor.getLong(3);
                    ContactItem contactItem = new ContactItem();
                    contactItem.setUser_phNumber(cursor.getString(0));
                    contactItem.setUser_Name(cursor.getString(1));
                    contactItem.setPhoto_id(photo_id);
                    contactItem.setPerson_id(person_id);
                    
                    hashlist.add(contactItem);
                } while (cursor.moveToNext());
            }
            contactItems = new ArrayList<>(hashlist);
            for (int i = 0; i < contactItems.size(); i++) {
                contactItems.get(i).setId(i);
            }
            return contactItems;
        }
    cs



    이제 이미지 뷰에 저장된 연락처의 이미지를 보여줄 때 photo_id, person_id를 갖고 사진을 갖고오는 법이다. 

    (메모리 문제로 가끔 튕길수 있기때문에 임의의 크기(120)로 이미지를 리사이징해서 불러온다.)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     public Bitmap loadContactPhoto(ContentResolver cr, long id, long photo_id) {
            Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
            InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
            if (input != null)
                return resizingBitmap(BitmapFactory.decodeStream(input));
            else
                Log.d("PHOTO","first try failed to load photo");
     
            byte[] photoBytes = null;
            Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, photo_id);
            Cursor c = cr.query(photoUri, new String[]{ContactsContract.CommonDataKinds.Photo.PHOTO}, nullnullnull);
            try {
                if (c.moveToFirst())
                    photoBytes = c.getBlob(0);
     
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            } finally {
                c.close();
            }
     
            if (photoBytes != null)
                return resizingBitmap(BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length));
     
            else
                Log.d("PHOTO""second try also failed");
            return null;
        }
     
        public Bitmap resizingBitmap(Bitmap oBitmap) {
            if (oBitmap == null)
                return null;
            float width = oBitmap.getWidth();
            float height = oBitmap.getHeight();
            float resizing_size = 120;
            Bitmap rBitmap = null;
            if (width > resizing_size) {
                float mWidth = (float) (width / 100);
                float fScale = (float) (resizing_size / mWidth);
                width *= (fScale / 100);
                height *= (fScale / 100);
     
            } else if (height > resizing_size) {
                float mHeight = (float) (height / 100);
                float fScale = (float) (resizing_size / mHeight);
                width *= (fScale / 100);
                height *= (fScale / 100);
            }
     
            Log.d("rBitmap : " + width + ", " + height);
            rBitmap = Bitmap.createScaledBitmap(oBitmap, (int) width, (int) height, true);
            return rBitmap;
        }
    cs


    댓글

Designed by Mhwan.