Search code examples
javaandroidandroid-intentandroid-cameraandroid-camera-intent

Camera intent Android return null


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


Solution

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