지식메모/안드로이드 Android

안드로이드 화면캡쳐시 bitmap null 값 현상

yonoo 2013. 7. 7. 15:31
반응형



어플을 만드는데 현재화면 캡쳐가 아닌 레이아웃을 캡쳐하는 기능이 필요했다.

그것도 전체 레이아웃이 아닌 상단 바를 제외한 부분 레이아웃캡쳐였다.


그래서 인터넷에 검색하여 아주 간단한 화면캡쳐소스를 구해 돌려보았다. 


그런데 내 테스트기기 중 2.2프로요 기기에서는 잘 되는데 4.0 아이스크림 기기에서는 안되는 것이었다.

요즘 누가 2.2 쓰나 . 4.0에서 작동되는게 중요했기 때문에 계속 해결책을 찾아보았다.


소스상에는 문제가 없으나 어플을 실행하고 캡쳐버튼을 누르면 자꾸 강제종료가 되었다.

로그캣에서는 Bitmap이 널 값이 난다고 나와있었다.

container.buildDrawingCache();
container.setDrawingCacheEnabled(true);
Bitmap captureView = container.getDrawingCache();//비트맵 널 값에러나는 부분

그래서 로그로 container.getDrawingCache(); 이걸 출력해보니 이게 널 값이라고 떴다. 이게 문제였다.

그래서 위 소스를 활용한 간단한 캡쳐예제를 두 테스트기기에서 돌려보니 잘 되었다.

이 예제였다. 용돈벌기 책 예제이다.

CapturePartEx.zip


??

2.2 ,4.0 둘 다 캡쳐가 잘된다. 


이걸 그대로 따라서 적용해보았는데

뭐야 같은 방식인데  똑같이 따라한건데 왜 예제는 되고 내가하면 안되는거지..

미쳐버릴 노릇이었다. 



슈퍼삽질을 해보니 안드로이드 버전에 따른 API기능상 문제는 아니라는 결론을 내렸고

다른 방법으로 캡쳐하는 방법을 찾아보기로 했다.


그래서 온갖 구글링을 찾아 헤매다가 거의 두 달만에 해결을 했다.


https://groups.google.com/forum/#!searchin/android-developers/android$20getDrawingCache/android-developers/VQM5WmxPilM/gYHJGQZh7hMJ


여기 있는 걸 따라해봤더니 갑자기 된다..

바로 캡쳐하지않고 캔버스에 그려서 캡쳐하는 방식인 것 같았다.


 int width_container = container.getWidth() ;//캡쳐할 레이아웃 크기

 int height_container = container.getHeight() ;//캡쳐할 레이아웃 크기



container.setDrawingCacheEnabled(true);

container.buildDrawingCache(true);


/***********************핵심부분**********************************/
Bitmap captureView = Bitmap.createBitmap(container.getMeasuredWidth(), 

 container.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 

Canvas screenShotCanvas = new Canvas(captureView ); 

container.draw(screenShotCanvas); 
/***********************핵심부분*****************************************/


	                FileOutputStream fos; 		

 			Intent it3=getIntent();	

 			String str_name=it3.getStringExtra("it3_name");	 			



 			File fileRoute = null;

 			fileRoute = Environment.getExternalStorageDirectory(); 		



 			try {

 				File path = new File(fileRoute,"temp");

 				if(!path.exists()){//if(!path.isDirectory()){

 					path.mkdirs();

 				} 		



 				fos = new FileOutputStream(fileRoute+"/temp/"+str_name+"-.jpeg");

 				Log.d("[screenshot]", " : " + container.getDrawingCache());

 				captureView.compress(Bitmap.CompressFormat.JPEG, 100, fos);

 				container.setDrawingCacheEnabled(false); 		



 			}catch (FileNotFoundException e) {

 				e.printStackTrace();

 			}



이 방법을 쓰니 해결이 되었다.


진짜 온갖 안드로이드 커뮤니티에 글도 올려보고 책 저자에게 메일도 보내고 별 짓 다 해봤는데 안되니까 정말 짜증났다. 진짜 번역기 돌려서 스택오버플로우에도 올려봤는데 아무도 대답을 안해주고..


진짜 90퍼 완성해놓고 남은 하나 때문에 시간낭비하는 건 도무지 못 해먹겟다.ㅜㅜ

이 글로 다른 누군가가 삽질할때 도움이 되었으면 좋겠다.




반응형