소근소근

휴대폰 주소록 사진 불러오기(비트맵Bitmap, ImageView) [AndroidStudio-JAVA] 본문

AndroidStudio

휴대폰 주소록 사진 불러오기(비트맵Bitmap, ImageView) [AndroidStudio-JAVA]

JJureng 2021. 7. 5. 13:13
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