2011-02-14 2 views
8

기본 카메라 앱에서 가져온 이미지가있는 앱을 개발 중입니다. 사용자에게 표시됩니다. 내가 한 코드는 다음과 같습니다Android Samsung : 카메라 앱이 intent.getData()를 반환하지 않습니다.

여기
/* Intent */ 
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
startActivityForResult(intent, TAKE_PICTURE); 

/* Result */ 
onActivityResult(int requestCode, int resultCode, 
     Intent returnIntent) { 
    if(requestCode == TAKE_PICTURE) { 
     //picture from Camera 
     if (resultCode == Activity.RESULT_OK) { 
      if(returnIntent != null) { 
       try { 
        // Get the file path where the image is stored. 
        // This runs fine on all devices, except Samsung ones. 
        Uri selectedImage = returnIntent.getData(); 

        if(selectedImage == null) { 
         if(returnIntent.getExtras() != null && 
          returnIntent.getExtras().get(AppConstants.DATA) != null) { 

          // But, I get the image Bitmap here. Means the image is stored in disk. 
          Bitmap bmp = (Bitmap) returnIntent.getExtras().get(AppConstants.DATA); 
         } 
        } 
       } catch (Exception e) { 
        // 
       } 
      } 
     } 
    } 
} 

문제는, 위의 코드는 내가 노력 모든 장치에서 잘 작동 (HTC의, SE의)하지만 어떻게 든 삼성 것들에 실패합니다. "Uri selectedImage = returnIntent.getData();" 아무것도 반환하지 않습니다. 내 전체 애플 리케이션은 파일 경로를 저장하는이 논리 위에 구축되므로 진행할 수 없습니다. 해결책 사람이 있습니까?

+0

해결책을 찾았습니까? – Sharj

답변

11

그림의 파일 이름을 지정할 수있는 의도에 대한 EXTRA_OUTPUT 매개 변수를 지정하는 코드는 Specify filename for picture to be taken을 참조하십시오. 활동 결과가 호출 될 때 파일 이름을 기억하고 intent.getData가 NULL 인 경우 해당 파일을 사용하십시오.

그리고 다른 버그 설명을 읽으면 Android에서 사진을 찍는 데 얼마나 많은 문제가 있는지 알 수 있습니다.

+0

"파일 이름 기억"하려고하지만 ActivityForResult가 호출 될 때 멤버 변수도 null입니다 ... – ogborstad

+0

@ogborstad는 변수를 정적 필드로 선언하고 null로 초기화하지 않습니다. 그렇지 않으면 변수를 덮어 씁니다. – Merlin

+0

이 질문이 게시 된 지 오래되었지만 사진 갤러리에서 이미지를 얻으려면 어떻게해야하는지 알고 있습니까? 분명히 적은 수의 전화기에 'Uri uri = data.getData();'는 항상 null을 반환합니다 (S3 mini, W8L..something). – Sebek

3

가장 좋은 방법은 그림을 저장할 파일 경로를 생성하여 멤버 변수에 저장하는 것입니다. 그런 다음 카메라 작업을 호출 할 때 MediaStore.EXTRA_OUTPUT extra에 Uri로 넣으십시오.

onSaveInstanceState() 및 onRestoreInstanceState()를 재정의하고이 경로를 올바르게 저장/복원하십시오. 이렇게하면 시스템이 그 사이에 활동을 다시 시작하기로 결정한 경우 오리 엔테이션 변경 및/또는 메모리 부족으로 인해 발생할 수있는 문제를 방지 할 수 있습니다.

+0

위 예제에서 savedInstanceState() 및 onRestoreInstanceState()를 처리하는 방법에 대한 예제를 제공 할 수 있습니까? – Darpan

관련 문제