1

Start Intent Code :

Intent takePictureIntent = new Intent();
takePictureIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageUri);
takePictureIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);

OnActivityResult Code :

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

    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == UserVisitDetailActivity.RESULT_OK && data != null){
        System.out.println("Masuk Camera");

        Bitmap photo = (Bitmap) data.getExtras().get("data");
        System.out.println(photo);
        imageUri = getImageUri(getApplicationContext(), photo);
        checkInHolder.setImageURI(imageUri);
    }
}

Get Image URI Code :

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

The code run smoothly but after several modification, it suddenly return null data. Thank you for your help

1 Answers1

3

I have an code that working on SDK 32 successfully.

  1. first of you need to setup manifest.xml

<manifest
    ....>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />

    <queries>
        <intent>
            <action android:name="android.media.action.IMAGE_CAPTURE" />
        </intent>
    </queries>
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature android:name="android.hardware.camera"
        android:required="true" />

    <application
        android:requestLegacyExternalStorage="true"
        ....>

    <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
    </provider>

    </application>
</manifest>
  1. need to create provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
  <paths>
    <external-path
        name="external"
        path="." />
    <external-files-path
        name="external_files"
        path="." />
</paths>
  1. setup java code.
// create global variable
private File photoFile = null;

//create methods...
  private void chooseFromCamera(int requestCode) {
      Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      try {
          photoFile = createImageFile();
          if (photoFile != null) {
              Uri photoURI = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", photoFile);
              takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
              startActivityForResult(takePictureIntent, requestCode);
          }
      } catch (Exception e) {
          e.printStackTrace();
      }
  }
  
  private File createImageFile() throws IOException {
      long timeStamp = Calendar.getInstance().getTimeInMillis();
      String imageFileName = "JPEG_" + timeStamp + "_";
      File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
      File image = File.createTempFile(
              imageFileName,  /* prefix */
              ".jpg",   /* suffix */
              storageDir      /* directory */
      );
      return image;
  }

  1. start intent for capture image.
chooseFromCamera(REQUEST_IMAGE_CAPTURE);
  1. get bitmap...
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK && data != null){
        if (photoFile != null) {
            bitmap = BitmapFactory.decodeFile(photoFile.getAbsolutePath());
        }
    }
}
Urvish Shiroya
  • 530
  • 1
  • 7