2013-06-25 2 views
1

최근에 카메라의 빌드에서 사진을 찍어 내 응용 프로그램에서 다시 가져와야하는 안드로이드 응용 프로그램을 작성했습니다. 나는 거기에있는 많은 튜토리얼 중 하나를 사용했고 모든 것이 잘 작동했다. 하지만 다른 장치에서 테스트 한 결과 전혀 작동하지 않았습니다. 문제가있는 것처럼 보이므로 모든 장치에서 사진을 찍을 수 있도록 어떻게해야합니까? (내 대답은 자습서와 비슷합니다.)Android : 카메라에서 사진 가져 오기 - 조심하십시오

답변

5

많은 튜토리얼 중 하나를 사용했는데 모든 것이 잘 동작했습니다. 하지만 다른 장치에서 테스트 한 결과 전혀 작동하지 않았습니다. 처음에 나는 매우 놀랐지 만, 나는이 주제에 더 깊이 들어가기로 결정했다. 그리고 나는 많은 튜토리얼이 큰 문제를 일으킬 수 있다는 것을 깨달았습니다. 그래서 나는 당신과 나의 경험을 공유하기로 결정했습니다.

대부분의 자습서가 사용하고있는 일반적인 승인 절차부터 시작하겠습니다.

private static final int CAMERA_PIC_REQUEST = 1337; 

그런 다음 당신이 의도를 작성하고 시작

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 

다시 사진을 얻으려면 당신이 onActivityResult를 기능을 사용하여 카메라의 활동을 읽기 :

은 처음에는 그런 RequestID가 뭔가를 선택 수신 된 인 텐트 데이터의 화상

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK && data != null) { 
     // do something like 
     Bitmap bitmap = (Bitmap) data.getExtras().get("data"); 
    } 
} 

고개 그렇지 않니? 잘 작동하지만 지금은 까다로운 부분이 있습니다.

안드로이드 문서에 기록 된대로 인 텐트 데이터는 축소 된 사진 만 반환하거나 찍은 사진의 작은 버전을 말하고 일부 장치는 전혀 반환하지 않습니다. 데이터가 null이 아니지만 결과 ResultInfo 전달 실패 예외가 발생할 수도 있습니다.

이제 무엇을 할 수 있습니까? 이를위한 솔루션은 매우 간단합니다. 카메라에 그림을 SD 카드에 저장하고이 파일에 URI를 반환하도록 지정하면됩니다. 아래에서, 위에서 편집 된 코드를 보여 드리겠습니다.

우리는 URI에 정적 RequestID가 을 만들 카메라 활동을 만들지 만,이 시간 우리는 추가 매개 변수 (우리 URI) 지금

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 

과에 합격 우리보다

private static final int CAMERA_PIC_REQUEST = 1337; 
private static Uri outputFileUri; 

위와 같은 방법을 사용하지만 URI를 사용하는 의도 데이터 대신

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) { 
      // do something to get the bitmap from the uri for example 
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), outputFileUri); 
} 

이 솔루션을 사용하면 모든 장치에서 사진을 얻을 수 있습니다. 그러나 풀 스케일 비트 맵을 얻었으므로 메모리 오류를 피하기 위해 비트 맵을 축소해야 할 수도 있습니다. 사용자가 SD 카드에 저장된 사진을 유지하지 않으려면 해당 파일을 삭제하면됩니다.

읽어 주셔서 감사합니다.

관련 문제