4

이 코드는 이전에 삼성에서 작동했지만 Android 2.3.6과 함께 Nexus One을 사용하고 있습니다. 사진을 찍고 확인을 클릭하거나 갤러리에서 사진을 선택하자마자 충돌합니다. Stacktrace는 Uri에 대한 널 포인터 예외를 보여줍니다. 문제가 될 수있는 것을Android 카메라 캡처 작업이 null을 반환합니다.

public void activateCamera(View view){  
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    // start the image capture Intent 
    startActivityForResult(i, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    if ((requestCode == CHOOSE_IMAGE_ACTIVITY_REQUEST_CODE || requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) 
     && resultCode == RESULT_OK && null != data) { 

     selectedImage = data.getData(); 

     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

     Cursor cursor = getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 

     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 

     String picturePath = cursor.getString(columnIndex); 

     cursor.close(); 

     Bitmap bits = null; 

     BitmapFactory.Options options = new BitmapFactory.Options(); 

     options.inSampleSize = inSampleSize; 

     try { 
      bits = BitmapFactory.decodeStream(new FileInputStream(picturePath),null,options); 
     } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 

어떤 생각을 다음과 같이
내 코드는 활성화 카메라인가? 감사합니다.

private Uri mMakePhotoUri; 

private File createImageFile() { 
    // return a File object for your image. 
} 

private void makePhoto() { 
    try { 
     File f = createImageFile(); 
     Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     mMakePhotoUri = Uri.fromFile(f); 
     i.putExtra(MediaStore.EXTRA_OUTPUT, mMakePhotoUri); 
     startActivityForResult(i, REQUEST_MAKE_PHOTO); 
    } catch (IOException e) { 
     Log.e(TAG, "IO error", e); 
     Toast.makeText(getActivity(), R.string.error_writing_image, Toast.LENGTH_LONG).show(); 
    } 
} 

@Override 
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    switch (requestCode) { 
     case REQUEST_MAKE_PHOTO: 
      if (resultCode == Activity.RESULT_OK) { 
       // do something with mMakePhotoUri 
      } 
      return; 
     default: // do nothing 
      super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

당신은 onCreate()onSaveInstanceState() withing에 인스턴스 상태에 대한 mMakePhotoUri의 값을 저장해야합니다 :

답변

9

당신은 사진을 저장하고 URI 직접 remeber에 카메라를, 말해야한다.

+0

하여 onActivityResult에서 직접 파일을 저장 한 경로를 정의, 어떤 엑스트라를 전달 해달라고,하지만 HTC 장치와 : https : //로 유래 .com/questions/11288344/capture-images-htc-crashing devices – Muno

3

이 추가 정보를 onActivityResult를 호출 한 인 텐트에 삽입하면 시스템에서 모든 힘든 일을 처리합니다.

File f = createImageFile(); 
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 

이렇게하면 사진을 비트 맵으로 쉽게 가져올 수 있습니다.

private void handleSmallCameraPhoto(Intent intent) { 
    Bundle extras = intent.getExtras(); 
    mImageBitmap = (Bitmap) extras.get("data"); 
    mImageView.setImageBitmap(mImageBitmap); 
} 
0

그냥 당신이 배치 또는이 솔루션은 잘 작동

public void openCamera() { 

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    file = createImageFile(); 
    boolean isDirectoryCreated = file.getParentFile().mkdirs(); 
    Log.d("", "openCamera: isDirectoryCreated: " + isDirectoryCreated); 
    if (Build.VERSION.SDK_INT >= 23) { 
     tempFileUri = FileProvider.getUriForFile(getActivity().getApplicationContext(), 
       "com.scanlibrary.provider", // As defined in Manifest 
       file); 
    } else { 
     tempFileUri = Uri.fromFile(file); 
    } 

    try 
    { 
     cameraIntent.putExtra("return-data", true); 
     startActivityForResult(cameraIntent, ScanConstants.START_CAMERA_REQUEST_CODE); 
    } 
    catch (Exception e) 
    { 
    } 
} 

private File createImageFile() { 
    clearTempImages(); 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new 
      Date()); 
    File file = new File(ScanConstants.IMAGE_PATH, "IMG_" + timeStamp + 
      ".jpg"); 
    fileUri = Uri.fromFile(file); 
    return file; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    Bitmap bitmap = null ; 
    if (resultCode == Activity.RESULT_OK) { 
     try { 
      if (Build.VERSION.SDK_INT >= 23) { 
        tempFileUri = FileProvider.getUriForFile(getActivity().getApplicationContext(), 
          "com.scanlibrary.provider", // As defined in Manifest 
          file); 
       } else { 
        tempFileUri = Uri.fromFile(file); 
       } 

        bitmap = getBitmap(tempFileUri); 



        bitmap = getBitmap(data.getData()); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } else { 
     getActivity().finish(); 
    } 
    if (bitmap != null) { 
     postImagePick(bitmap); 
    } 
} 
관련 문제