안드로이드 이미지 용량제한 - andeuloideu imiji yonglyangjehan

어느 날, 오후 급하게 회사 메신저로 CS 측에서 문의가 왔습니다. 앱에서 특정 매장의 메뉴를 선택하는 과정에서 앱이 뻗어버린다는 것이었습니다.


안드로이드 이미지 용량제한 - andeuloideu imiji yonglyangjehan
안돼...

처음에 디버그도 찍어보고 관리자 페이지의 데이터를 대조하면서 확인해도 뚜렷한 오류 로그가 나오지 않아서 굉장히 난감했습니다. 헤매다가 결국 찾았는데 바로 인텐트에 담아서 보내는 데이터의 사이즈가 문제였습니다.

찾아보니 인텐트에 데이터를 담을 때, 대략 500KB 정도가 넘어가면 앱이 Crash가 날 수 있다고 합니다.

확인해보니 상품들의 옵션들이 계속 추가되면서 넘길 수 있는 데이터의 한계를 넘어선 듯했습니다.

해결 방법을 찾아보니 Intent를 사용할 때 기본적인 정보만을 담고 더 많은 데이터를 Intent에 담아야 한다면 다음과 같은 방법을 고려해보라고 했습니다.

  • Data 를 file(임시) 로 저장하고 활용(Data가 큰 용량일 경우)
  • Data 를 Application Instance 에 저장
  • Data 를 singleton 에 저장

위의 예제를 실제로 어떻게 적용할지 코드로 구현해보았습니다.


🔍 file(내부 저장소)에 저장하고 활용

내부 저장소에 파일 저장 (경로는 data/data/패키지명/files/파일명으로 저장됩니다)

val jsonText = "blabla"

try {
    val file : FileOutputStream = openFileOutput("test.txt",MODE_PRIVATE)
    file.write(jsonText.toByteArray())
    file.close()
}catch (e : IOException){
    e.printStackTrace()
}

파일 데이터 가져오기

var data : String = ""
            try {
                val fileInputStream = openFileInput("test.txt")
                data = fileInputStream.read().toString()
                fileInputStream.close()
            }catch (e : IOException){
                e.printStackTrace()
            }

🔍 Application Instance 저장

class MasterApplication : Application() {
    var data : String = "test";

    init{
        instance = this
    }

    companion object{

        lateinit var instance : MasterApplication
        fun ApplicationContext() : Context{
            return instance.applicationContext
        }
    }
}

사용법

val intentData = MasterApplication.instance.data

🔍 Singleton으로 저장

간단하게 Kotlin Object를 이용해서 저장할 수 있습니다.

object Data{
    val jsonString : String? = null
}

사용법

val intentData = Data.jsonString

참조

  • https://www.neotechsoftware.com/blog/android-intent-size-limit

"이미지 용량 줄이기" 는 이미지(사진)의 사이즈와 용량을 줄이는 앱입니다.

요즘 고화질 카메라를 가진 단말들도 많이 나오고,
디지털 카메라로 촬영한 사진들을 스마트폰에 넣는 경우도 많이 있죠.

아무리 플래시 메모리( SD Card )의 용량이 많이 늘어났어도,
그래도 고화질의 많은 양의 사진을 감당하기는 어렵죠.
그리고 고용량의 외장 메모리를 구매하는 것은 경제적으로 부담이 되죠!!

원본은 PC 에 백업해놓으시고,
스마트폰에서는 이미지를 줄여서 용량을 많이 확보해보세요.
( 어느 정도 이미지 크기를 줄여도 스마트폰에서 보는데는 지장이 없습니다. )

여러개의 이미지를 한번에 줄일수도 있답니다!!

이미지를 줄이면 카카오톡, 카카오 스토리, 페이스북 등 SNS에 사진을 올릴 때 더 적은 데이터로 더 빨리 업로드 할 수 있습니다.

이제 용량 때문에 버벅대는 스마트폰은 안녕!
이제 용량 때문에 무엇을 삭제해야할지 고민하는 것도 이제 그만!!

"이미지 용량 줄이기" 와 함께 스마트폰에 맞는 퀄리티로 이미지를 줄여
많은 용량을 확보해보세요!!
----
개발자 연락처 :

이미지 용량 줄이기 질문있습니다

0 추천

갤러리에서 사진 불러오기 or 사진촬영 이미지를 서버로 전송하는데, 용량이 너무 커서 줄이고 싶은데 어느방법으로 해야하나요 ?

자세한 설명이나 예제 있으시면 알려주시면 감사하겠어요 도와주세요ㅜ ㅜ..

  • 이미지용량
  • 사이즈조절
  • 이미지전송

보꼬 (1,630 포인트) 님이 2015년 3월 2일 질문

1개의 답변

+1 추천

채택된 답변

이미지의 실제 크기를 줄이고자 하면 BitmapFactory.createScaledBitmap 이라는 메소드 이용하시면 되구요

실제 크기는 그대로 두고 샘플레이트 조절을 이용해서 용량을 줄이고자 한다면 BitmapFactory.Options 의 inSampleSize를 이용하시면 됩니다. 

자세한 사용방법은 아래 블로그 참고하세여

http://mainia.tistory.com/468

Gradler (109,780 포인트) 님이 2015년 3월 2일 답변
보꼬님이 2015년 3월 3일 채택됨

친절한 답변과 예제 감사드려요 ^^ 참고해서 해볼게요

보꼬 (1,630 포인트) 님이 2015년 3월 3일 댓글작성

1.

서버에 이미지파일을 업로드 해야하는 작업이 생겼다.

해당 이미지파일은 증빙용도 이미지파일이기에. 

작은 용량으로 업로드해야해서 용량을 줄이는 작업이 필요했다.

2.

    private String getImageViewToFileResizing(Bitmap bitmap){

        String mUri = "";


        if(bitmap != null) {
            FileOutputStream fout = null;
            try {
                int MAX_IMAGE_SIZE = 150 * 1024; // max final file size
                int compressQuality = 100; // quality decreasing by 5 every loop. (start from 99)
                int streamLength = MAX_IMAGE_SIZE;
                album_fileName = System.currentTimeMillis() + "_pic.jpg";

                File file = new File(dirFile,album_fileName);
                while(streamLength >= MAX_IMAGE_SIZE){
                    fout = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, compressQuality, fout);
                    streamLength = (int) file.length();
                    compressQuality -= 5;
                }

                fout.flush();
                mUri = file.getPath();


            } catch (Exception e) {
                e.printStackTrace();
            }
            finally{
                if(fout!=null){
                    try{
                        fout.close();
                    }catch(Exception e){
                    }
                }else{
                }
            }

        }

        return mUri;
    }

Bitmap 이미지파일을 압축시켜 로컬저장소에 저장하는로직이며.

해당 파일의 크기를 측정해 사이즈가크면 파일의 품질을 줄여나가서 

원하는 사이즈의 파일을 만드는 로직이다.

해당 소스의경우 150kb 이하로 설정했으며, 원하는 사이즈로 설정해서

작업하면된다.

이후. 해당파일을 서버에 업로드하는 작업으로 개발 완료됐다.

3.