2022년 8월 27일 토요일

Android 갤러리 이미지 가져오기

 Android 앱 개발시 자신의 갤러리 이미지를 가져오는 기능을 개발하는 경우가 있습니다.

Android O/S 버젼이 올라가면서 접근 제한이 많이 일어나고 갤러리 프로그램도 로컬 방식이 아닌

클라우드 방식(구글포토) 을 쓰는것들도 있기 때문에 그것들에 대한 처리 가이드를 안내하려 합니다.

코드는 Java로 구성 되어 있습니다.

일단 Android 주 앱 소스에 AndroidManifest.xml 에 권한을 추가 합니다.

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

갤러리 호출은 Intent 를 통해서 호출하여 가져 올수 있습니다.

아래 코드를 Activity Content 를 통해서 호출 합니다.

Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 ((Activity)m_oContext).startActivityForResult(i, 1);

startActivityForResult 호출시 두번째 인자는 호출후 돌려받는 리턴 코드값입니다.

편의상 1 로 설정 했습니다.

갤러리 호출후 리턴받는 곳은 활성화된 Activity 에서 돌려 받아 처리 합니다.

코드는 아래와 같습니다.


@Override
protected void onActivityResult(int nReqCode, int nRetCode, @Nullable Intent data)
{
    super.onActivityResult(nReqCode, nRetCode, data);

    switch (nReqCode)
    {
        case 1://Gallery
        {
            if (nRetCode == RESULT_OK && data != null)
            {
                Bitmap bmImage = null;
                try
                {
                    Uri oSelectImg = data.getData();
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P)
                    {
                        bmImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), oSelectImg);
                    }
                    else
                    {
                        ImageDecoder.Source oSrc = ImageDecoder.createSource(this.getContentResolver(), oSelectImg);
                        bmImage = ImageDecoder.decodeBitmap(oSrc);
                    }

                    if(m_oTestMainView != null)
                    {
                        m_oTestMainView.m_oImgGallery.setImageBitmap(bmImage);
                    }
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            else if(nRetCode == RESULT_CANCELED)
            {
                Toast.makeText(this, "사진 선택 취소", Toast.LENGTH_LONG).show();
            }
        }break;
    }
}

"m_oTestMainView" 는 별도로 구성된 LinearLayout 입니다. 그 안에 ImageVIew m_oImgGallery 를 만들어 놓고 불러들인 갤러리 이미지를 비트맵 으로 셋팅하면 이미지가 나옵니다.

갤러리 이미지는 직접 Uri 경로로 접근해서 읽어 들일수도 있으나 위에서 언급한것처럼 클라우드 기반 갤러리는 경로를 가져올수 없습니다.

그래서 범용적으로 처리를 하시려면 Bitmap 을 자기 앱 경로에 직접 이미지 파일로 저장하여 처리 하는것을 권장합니다.

Bitmap 을 이미지 파일로 저장 하시려면

저장할 File의 OutputStream 을 만들고 아래 코드를 호출하여 저장하시면 됩니다.


File oFile = new File(context.getFilesDir(), '저장상대경로');
OutputStream osFile = new FileOutputStream(oFile);
bmImage.compress(Bitmap.CompressFormat.PNG, 100, osFile);

그럼 ^^

댓글 없음: