반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 타입스크립트
- 몰입캠프
- computergraphics
- 자바스크립트
- nodeJS
- 카이스트맛집
- 카이스트
- 자바
- BFS
- 우선순위큐
- 분리집합
- 궁동
- html
- node.js
- 컴퓨터그래픽스
- 어은동맛집
- 프래그먼트
- 몰입캠프후기
- 안드로이드스튜디오
- glfw
- 리사이클러뷰
- MySQL
- 대전맛집
- 백준
- DP
- 알고리즘
- 후기
- 프로그래머스
- 앱개발
- 위상정렬
Archives
- Today
- Total
소근소근
휴대폰 주소록 사진 불러오기(비트맵Bitmap, ImageView) [AndroidStudio-JAVA] 본문
728x90
반응형
SMALL
지난번 업로드에서 휴대폰에서 주소록(이름, 번호) 불러오기에서 사진까지 가져오는 것을 추가했다.
MainActivity의 onCreate함수에서 contentResolver로 이미지를 불러올 수 있다.
ArrayList<String> numbook = new ArrayList<>();
ArrayList<String> namebook = new ArrayList<>();
ArrayList<Bitmap> photobook = new ArrayList<>();
//MainActivity 클래스 내부 변수
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//bring the phone numbers
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI , null ,null, null, null);
if(cur.getCount()>0){
String line = ""; //이름 저장
String line2 =""; //번호 저장
while(cur.moveToNext()){
int id = cur.getInt(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
line2 += name; //이름
if(("1").equals(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))) {
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?", new String[]{String.valueOf(id)}, null);
int i = 0;
int pCount = pCur.getCount();
String[] phoneNum = new String[pCount];
String[] phoneType = new String[pCount];
while (pCur.moveToNext()) {
phoneNum[i] = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
line += phoneNum[i]; //번호
phoneType[i] = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
i++;
}
}
int photoid = cur.getInt(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_ID));
Bitmap bitmap = queryContactImage(photoid);
photobook.add(bitmap);
numbook.add(line);
line ="";
namebook.add(line2);
line2 = "";
}
}
}
밑줄친 부분이 사진 불러오기 위해 추가된 코드이다.
private Bitmap queryContactImage(int imageDataRow){
Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {
ContactsContract.CommonDataKinds.Photo.PHOTO
}, ContactsContract.Data._ID + "=?", new String[] {
Integer.toString(imageDataRow)
}, null);
byte[] imageBytes = null;
if (c != null) {
if (c.moveToFirst()) {
imageBytes = c.getBlob(0);
}
c.close();
}
if (imageBytes != null) {
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
} else {
return null;
}
}
이 함수는 mainactivity에서 photoid를 받아 bitmap 형식의 이미지를 리턴하는 함수이다.
https://pythonq.com/so/android/1513750 링크를 참조한 코드이다.
fragment 의 recyclerView에서 주소록을 띄우고 있어서, adapter의 onBindViewHolder 함수에서 set을 해주었다.
private ArrayList<String> numbook;
private ArrayList<String> namebook;
private ArrayList<Bitmap> photobook;
public void onBindViewHolder(@NonNull PhoneAdapter.MyViewHolder holder, int position) {
String number = numbook.get(position);
holder.phonenum.setText(number);
String name = namebook.get(position);
holder.name.setText(name);
Bitmap bitmap = photobook.get(position);
holder.photo.setImageBitmap(bitmap);
}
holder의 photo는 imageView이고 , setImageBitmap으로 비트맵 이미지를 set할 수 있다.
null-safe다.
Bitmap ?
안드로이드에서 이미지를 표현하기 위해 사용되는 객체.
메모리에서 만들어지는 모든 이미지는 비트맵으로 관리된다.
비트맵 객체로 이미지를 조작할 수 있다.
728x90
반응형
LIST
'AndroidStudio' 카테고리의 다른 글
EditText 입력 시 키보드 화면 밀림 현상 해결[AndroidStudio-JAVA] (0) | 2021.07.05 |
---|---|
TabLayout , ViewPager2 , fragment로 탭 구조 구현하기 [AndroidStudio-JAVA] (0) | 2021.07.05 |
이미지뷰(ImageView) 안보이는 현상 해결[AndroidStudio-JAVA] (0) | 2021.07.05 |
리사이클러뷰(RecyclerView)에서 클릭(click)이벤트 처리[AndroidStudio-JAVA] (0) | 2021.07.04 |
안드로이드 스튜디오 휴대폰 주소록 불러오기 [AndroidStudio-JAVA] (0) | 2021.07.04 |