Android camera capture activity returns null Uri

This code worked on samsung before, but now when I use the Nexus One with Android 2.3.6, it breaks as soon as I take a picture and click ok or select a photo from the gallery. Stacktrace shows a null pointer exception to a Uri.
My code to activate the camera is as follows:

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(); } 

Any idea what could be the problem? Thanks!

+4
source share
3 answers

You must tell the camera where to save the image and watch uri:

 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); } } 

You must save the value of mMakePhotoUri over instance states with onCreate() and onSaveInstanceState() .

+9
source

Bring this add-on to the intent that triggered the onActivityResult, and the system will do all the heavy lifting for you.

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

Doing this makes it easy to find a photo as a bitmap.

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

Do not pass any additional functions, just define the path where you placed or saved the file directly in onActivityResult

  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); } } 
0
source

Source: https://habr.com/ru/post/1499522/


All Articles