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);

그럼 ^^

댓글 없음: