개발을 하다 보면 특정기기에서만 알수 없는 이유로 앱이 크래쉬가 나거나 오류가 발생하곤 한다.
원인을 파악하기 위해 파헤치다보면 간혹 프레임워크의 버그이거나 특정기기의 소프트웨어 문제이거나 아니면 내가 모르는 문제이다.
카메라와 관련된 앱을 개발하면서 알게된 G5 관련 이슈 2가지가 있다.
사진 저장 경로 문제
일반적으로 사진을 찍을 때 다음과 같이 인텐트를 구성해서 액티비티를 호출하게 된다.
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri cacheUri = ... cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cacheUri); startActivityForResult(cameraIntent, REQ_PHOTO);
MediaStore.EXTRA_OUTPUT을 Key로 하여 Uri를 넘겨주면 일반적인 Camera App은 이를 받아 내가 지정한 경로에 사진을 찍어서 저장시킨다.
하지만 G5에 내장된 기본 카메라는 EXTRA_OUTPUT에 경로를 지정해도 DCIM에 저장하는 듯 하다.
MediaStore 관리
안드로이드는 사진 / 동영상 / 파일 / 음악 등을 MediaStore라는 데이터베이스에 관리한다. 위의 첫번째 문제에 포함된 코드처럼 startActivityForResult를 호출하여 사진을 찍고 난 뒤 onActivityResult에서 일반적으로 결과를 받아 처리한다.
나의 경우에는 방금 찍은 사진의 MediaStore의 ID 가 필요했다.
Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.MediaColumns._ID},null,null,null);
갤럭시를 비롯한 다른기기는 사진을 찍자 마자 onActivityResult에서 query하면 ID를 얻을 수 있으나, G5는 사진이 데이터베이스에 등록되지 않아 cursor가 null이 된다. 특정 시점이 지난 뒤에는 물론 조회가 가능하다.
이는 G5의 오류라고 보기는 힘들지만 다른 기기는 다 되는데 G5는 되지 않았다. 할 수 없이 G5를 위해 비즈니스 로직을 비동기적으로 수정해야만 했다. 끝
0개의 댓글