본문 바로가기
호구지책/Java/Android

[안드로이드] 사진 중복 저장 이슈

by 하늘의흐름 2015. 9. 1.
반응형

내가 만든 어플에서 괴현상이 발견되었다는 보고가 들어왔다.





어플의 기능 중에 사진을 찍어서 보내는 일이 있는데, 기본 카메라앱을 쓴다.

헌데 사진을 찍어서 보내지기는 하는데, 핸드폰에는 사진이 저장되지 않는다는 것이었다.

그리고 하루가 지나면 그 사진이 보인다는 것이었다. 

하루 동안 어디갔다가 갑자기 등장하는 것일까?

코드를 살펴보았으나 특이한 점은 없었다. 

다만 사진 경로가 하드코딩되어 있어서

문제의 소지가 있겠다고 판단하고, 그걸 메서드에서 구하도록 수정했다.

그렇게해서 해보니 사진이 잘 가져와지는 것 같았지만, 좀 더 자세히 찾아봤다.

일단 카메라 설정이 달랐다. 나는 SD카드를 쓰고, 그 사람은 내부저장소를 카메라폴더로 쓰고 있었다.

이 설정은 바꾸기가 쉽다. 카메라 어플을 켜고 톱니를 누르면 SD,IN를 번갈아가면서 바꿀 수 있기 때문이다. 

자세한 이야기는 아래에 코드와 함께 적는다.


카메라사진 가져오기

Intent i = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
	Uri.fromFile(new File(fullPath)));
	Log.i("FullPath", fullPath);
	startActivityForResult(i, CAMERA_CAPTURE); 

protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
 
		DevLog.i("msg","요청코드:"+requestCode+" 결과코드:"+resultCode); 
		final String path = "file://"+fullPath; 
		
		if (resultCode == RESULT_OK && requestCode == CAMERA_CAPTURE) {
//사진을 가져옴


}

}    

현재 어플에서는 카메라 어플을 사용해 촬영한 후, 사진을 가져오게 되는데

저렇게 onActivityResult 로 받아오게 되면, 사진이 중복해서 저장되는 문제가 있었다.

카메라폴더와 내가 직접지정한 fullPath의 경로. 이렇게 2군데 저장되는 것이었다.

굳이 2군데에 동일한 사진을 저장할 필요는 없었으므로 하나만 저장시키기 위해

하나를 삭제하면 되겠다고 생각했다.


하지만 카메라폴더에 있는 사진을 대체 어떻게 가져와야할까? 난감하였다.

그러다가 찾아보니, 가장 최근에 촬영한 사진 한장을 가져오는 메서드를 구할 수 있었다.

구한 곳(안드로이드 펍)


최근 촬영사진 가져오기

/**
	 * 가장 마지막에 촬영된 사진의 경로 가져오기 (표준 카메라 폴더 경로)
	 * @return
	 */
	public String getLastPhotoPath(){ 
		final String[] IMAGE_PROJECTION = {     
				MediaStore.Images.ImageColumns.DATA,
				MediaStore.Images.Thumbnails.DATA };
		
		final Uri uriImages = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;    
		String cameraPath = "'";
		
		try{ 
			final Cursor cursorImages = getContentResolver().
                             query(uriImages, IMAGE_PROJECTION, null, null, null); 
			if(cursorImages != null && cursorImages.moveToLast()){         
				cameraPath = cursorImages.getString(0); 
				cursorImages.close(); 
				DevLog.i("카메라최신사진경로", "cameraPath:"+cameraPath);
			}  
			
		}catch(Exception e){
			e.printStackTrace();
		}
		return cameraPath;
	}


실행하여서 카메라 폴더의 패스를 리턴하는 것을 확인했다.

그러나.. 파일객체를 이용해서 삭제를 시도해도 삭제가 되지 않았다.

이상했다. 

그러다가 생각났다. 언젠가 듣기로 SD카드에 있는 파일은 서드파티에서 조작할 수 없다고 정책이 바뀌었다고. 

실로 그랬다. 4.4 킷캣 버전부터는 서드파티에서 SD카드의 파일을 조작할 수 없었다.(구글디벨로퍼코리아블로그) 내 단말기에 예전에 쓰던 핸드폰의 SD카드를 넣어서 쓰고 있었고, 카메라 설정에서 저장경로가 SD카드로 잡혀 있었던 것이다.

해당 사항은 카메라 어플로 들어가서 내부저장소로 변경해주자 해결할 수 있었다..


하지만 한가지 문제가 또 있었다. 삭제한 이미지가 갤러리에서는 깨진 이미지로 보이는 것이었다.



그랬다. 새로고침 이슈가 남아 있었다.


갤러리 새로고침

/**
	 * 갤러리 새로고침
	 */
	private void galleryRefresh(String imgFullPath ) {
	    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
	    File f = new File(imgFullPath);
	    Uri contentUri = Uri.fromFile(f);
	    mediaScanIntent.setData(contentUri);
	    this.sendBroadcast(mediaScanIntent);
	}


새로고침을 언제 해주는 것이 맞는 것인지 약간 고민이 되었고,

결론은 직접 부딪혀보자 였다.

처음에는 삭제처리까지 되고 메서드를 호출했는데, 역시나 파일이 없어서 오류가 났다.

파일이 존재할 때, 카메라폴더의 사진을 새로고침해주고,

두번째로는 내가 지정한 fullPath의 사진을 새로고침해주었다.


갤러리로 빠져나와서 살펴보니, 더 이상 깨진 썸네일은 나타나지 않았다.

깨끗이 삭제가 된 것이었다. 그리고 원하는 경로에 사진도 생성되었고 말이다.



반응형

댓글