2016-08-30 5 views
0

내가 뭘 잘못하고 있니? createImageFile사진 의도 제로 길이 이미지

takePictureIntent

private void takePictureIntent(int request) { 
    final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) { 
     File file = null; 

     try { 
      file = createImageFile(request); 
     } catch (Exception e) { 
      showErrorDialog(getString(R.string.error), getString(R.string.error_saving_picture)); 
      Log.e(TAG, "Error while creating image file."); 
     } 

     if (file != null) { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); 
      startActivityForResult(takePictureIntent, request); 
     } else { 
      Log.e(TAG, "Error while creating image file."); 
      showErrorDialog(getString(R.string.error), getString(R.string.error_saving_picture)); 
     } 
    } 
} 

private File createImageFile(final int request) { 
    final File storageDir = new File(activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES), getString(R.string.app_name)); 

    if (!storageDir.exists()) { 
     if (!storageDir.mkdirs()) { 
      Log.e(TAG, "Cannot create parent folders."); 
      return null; 
     } 
    } 

    File file = null; 

    try { 
     file = File.createTempFile("test_", ".jpg", storageDir); 
    } catch (Exception e) { 
     Log.e(TAG, "Error while creating temp file."); 
    } 

    fileProduct = file; 

    return file; 
} 

onActivityResult를

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_IMAGE_PRODUCT) { 

    if (fileProduct == null ||!fileProduct.exists() ||fileProduct.length() == 0) { 
     showErrorDialog(getString(R.string.error), getString(R.string.error_taking_product_picture)); 
     return; 
    } 
} 
,536을 : 나는 전체 크기의 사진을 얻을 수있는 의도를 호출하기 위해 노력하고있어

때로는 (예, 때로는) 결과 파일의 길이가 0입니다. 나는 비공개 앱 컨텍스트의 폴더와 이미지 파일 (길이가 0 이상)을 확실히 알고 있습니다. 좀 도와 주실 수 있겠습니까? Nexus 5X에서 6.0 버전입니다.

답변

1

나는 File.createTempFile()을 제거함으로써 시작할 것입니다. 당신은 그것을 필요로하지 않는다, 그것은 시간을 낭비하고, 그것은 파일이 이미 있기 때문에 그 파일에 사진을 저장하지 않으려는 일부 카메라 응용을 일으킬지도 모른다. 직접 고유 한 파일 이름을 생성하십시오. 이렇게하면 점진적으로 호환성에 도움이됩니다.

또한 저장 한 인스턴스 상태 Bundle에서 fileProduct을 잡고 있는지 확인해야합니다. 카메라 앱이 포 그라운드에있는 동안 앱 프로세스가 종료 될 수 있기 때문입니다.

그러나 일반적으로 ACTION_IMAGE_CAPTURE은 그리 신뢰할 수 없습니다. 수백 가지의 가능한 카메라 앱 중 하나에 작업을 위임하고 있으며 일부 앱에는 버그가 있습니다. 하나의 그러한 버그가 EXTRA_OUTPUT을 무시하고 있습니다. 따라서 onActivityResult()에 올바른 fileProduct 값이 있다고 판단되면 data.getData()으로 전화하여 Uri이 있는지 확인하십시오. 이 경우 카메라 앱은 Uri으로 식별되는 위치에 사진을 저장했을 수 있으며 ContentResolverDocumentFile을 사용하면 Uri으로 작업 할 수 있습니다. 이 사용

+0

1과 2는 괜찮 았지만 Nexus 카메라 앱에서 그런 버그는 기대하지 않습니다 ...이 코드는 Lollipop이있는 Motorola Moto G 2014에서 정상적으로 작동합니다. 이것이 도움이 될 수 있다면 프래그먼트에서 startActivityForResult를 호출하려고합니다. 내가 여기서 얻지 못하는 것은 이미지가 있다는 것입니다. 파일 시스템은 ... sob입니다. – Jumpa

+0

@ Jumpa : 문제가 길이가 0 인 파일이 아닙니다. 내 생각 엔 프로세스가 백그라운드에서 종료 되었기 때문에'fileProduct'는'null'입니다. – CommonsWare

+0

나는 그것이 존재하는지 테스트했다. (나는 exist() 메소드를 의미한다) 그리고 null이 아니다. – Jumpa

0

:

final String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
file = new File(storageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 

대신

File.createTempFile() 

마술 문제를 해결할 것으로 보인다. CommonsWare 덕분에 (어떻게 든) 올바른 방향으로 나를 가리키고 있습니다.