본문 바로가기

Linux/Android

안드로이드 화면 캡쳐해서 저장하는 방법


출처 : http://jess0718.blog.me/40122824255

현재 App의 스크린 캡쳐.


 

 

 

위의 화면과 같이 안드로이드 프로그래밍을 하다보면 화면을 저장해서 파일로 출력해야할 때가 종종있다.

 

구현하고 나니 정말 간단한 것이었지만, 구현하기까지 적지 않은 삽질을 한 것 같아 다른 개발자들의 삽질을 조금이나마 막아보고자 글을 올린다.

 

아래는 화면을 캡쳐하는 메소드의 소스코드이다. 사실 위의 뇌구조 테스트 어플에서 사용된 메소드이며 이해하기 쉽도록

 

조금 변경하였다. 아래의 코드에서 '디렉토리명' '파일명' 부분에 자신이 원하는 디렉토리명과 파일명을 입력해주면 되겠다.

 

 

 

 

private void screenshot(Bitmap bm) {

try {

     File path = new File("/디렉토리명");

                   

          if(! path.isDirectory()) {

     path.mkdirs();

          }

          

String temp = "/디렉토리명/";

temp = temp + "파일명";

          temp = temp + ".jpg";

            

FileOutputStream out = new FileOutputStream(temp);

            bm.compress(Bitmap.CompressFormat.JPEG, 100, out);

                   

            sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,

          Uri.parse("file://" + Environment.getExternalStorageDirectory())));

catch (FileNotFoundException e) {

          Log.d("FileNotFoundException:", e.getMessage());

     }           

}

 

 

 

 

 

간단하게 코드를 설명하자면 path에 디렉토리 경로를 저장하고 만약 디렉토리가 존재하지 않으면 디렉토리를 생성하게 한다.

 

그 다음으로 디렉토리명에 파일명을 붙여 저장될 파일명을 지정하는 과정을 거쳐 파일 출력을 통해 JPEG파일의 형태로 저장하게 된다.

 

그 다음으로 브로드캐스트를 통해 새로운 파일을 검색하도록하여 갤러리에서 저장된 그림 파일을 확인할 수 있게 해준다.

 

 

 

위의 메소드만 실행해서는 파일이 저장되었는지 확일 할 수 없으므로 위의 뇌구조 테스트 어플에서 처럼

 

어떠한 파일명으로 저장되었는지 확인 출력해주는 토스트 메시지를 하나 간단하게 띄워주면 더욱 좋을 것 같다.

 

 

 

 

 

 

button.setOnClickListener(new OnClickListener() {

                     

@Override

     public void onClick(View v) {

     try {

          View v1 = layout.getRootView();

               v1.setDrawingCacheEnabled(true);

               bm = v1.getDrawingCache();

               screenshot(bm);

               Toast.makeText(MainActivity.this, "저장되었습니다.", Toast.LENGTH_SHORT).show();

          catch (Exception e) {

          e.printStackTrace();

          }

     }

});

 

 

 

 

위의 스크린샷 메소드를 사용하는 부분의 소스코드이다.  try-catch문의 스크린샷 메소드 호출 전에 루트뷰를 얻는 부분과

 

메소드 아래의 토스트 메시지를 띄워 저장이 되었음을 알려주는 부분으로 나눠볼 수 있을 것 같다.





======================================================================================================================


public void screenshot(View view)throws Exception {      

view.setDrawingCacheEnabled(true);

Bitmap screenshot = view.getDrawingCache();

String filename = "screenshot.png";

try {

File f = new File(Environment.getExternalStorageDirectory(), filename);

f.createNewFile();

OutputStream outStream = new FileOutputStream(f);

screenshot.compress(Bitmap.CompressFormat.PNG, 100, outStream);

outStream.close();

catch (IOException e) {

e.printStackTrace();

}

view.setDrawingCacheEnabled(false);

}


SDCard 에 파일을 담아준다.

화면에 뿌릴때 캐시를 사용하게 하여, 중간에 그 캐시를 가로채는 것이다.

가로챈 캐시를 Bitmap으로 담아와서 PNG 형식으로 저장한다.


파라미터는 현재 화면의 View 이다. 전체 화면을 캡쳐하고 싶으면

Activity.getWindow().getDecorView()

을 주면 되겠다.