-
[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 먼저 가져올 사용자의 유저 클래스를 만든다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960//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;}@Overridepublic String toString() {return this.user_phNumber;}@Overridepublic int hashCode() {return getPhNumberChanged().hashCode();}public String getPhNumberChanged(){return user_phNumber.replace("-", "");}@Overridepublic boolean equals(Object o) {if (o instanceof ContactItem)return getPhNumberChanged().equals(((ContactItem) o).getPhNumberChanged());return false;}}cs 아래는 ArrayList형태로 연락처를 가져오는 코드이다
12345678910111213141516171819202122232425262728293031323334public 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)로 이미지를 리사이징해서 불러온다.)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354public 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));elseLog.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}, null, null, null);try {if (c.moveToFirst())photoBytes = c.getBlob(0);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();} finally {c.close();}if (photoBytes != null)return resizingBitmap(BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length));elseLog.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 'Mhwan's Develope > Android' 카테고리의 다른 글
[Android Note] javax.net.ssl.SSLHandshakeException 인증서오류 (0) 2020.03.08 [Tip] Android Universal Image Loader 라이브러리 사용팁 (갤러리에서 선택한 이미지 보여주기) (0) 2016.11.02 [Tip] 안드로이드 디바이스 화면 사이즈 알아내기 (0) 2016.10.27 [Tip] 안드로이드 dp<->px 변환 (0) 2016.10.27 [Tip] 레이아웃 페이드인 애니메이션 (Fade in Layout) (0) 2016.10.25