👨🏻‍💻

Building Camera intent



Overview

2 ways to use Camera on Android:

  • Easy: Use default camera app with Intent on Android device
    • Fastest way to integrate to the app
  • Hard: Embed the camera to app by using Camera API
    • Allows custom functionalities (contols, filters)


How to build

Step 1. Define CAMERA, WRITE_EXTERNAL_STORAGE permissions and camera feature in Manifest

<!-- AndroidManifest.xml -->

<manifest ... >
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature android:name="android.hardware.camera"
        android:required="true" />
    ...
</manifest>

Step 2. Define ImageView and Button in layouts

<!-- activity_main.xml -->

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:gravity="center_horizontal">
    
    ...
    <ImageView
        android:layout_width="400dp"
        android:layout_height="400dp"
        android:id="@+id/image_view"
        android:contentDescription="@string/icon_description"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/capture_btn"
        android:text="@string/button_text" />
    ...
    
</LinearLayout>

Step 3. Initiate runtime permissions for camera and external storage

/* MainActivity.java */

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // UI elements binding
    mImageView = findViewById(R.id.image_view);
    mCaptureBtn = findViewById(R.id.capture_btn);

    mCaptureBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // check permissions
            if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED ||
                    checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) {
                // if not enabled, request
                String[] permission = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
                requestPermissions(permission, PERMISSION_CODE);
            } else {
                // permissions already granted
                openCamera();
            }
        }
    });
}

Step 4. Handle permissions with onRequestPermissionsResult()

/* MainActivity.java */

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == PERMISSION_CODE) {
        if (grantResults.length > 0 && grantResults[0] ==
                PackageManager.PERMISSION_GRANTED) {
            openCamera();
        } else {
            Toast.makeText(this, "Permission denied...", Toast.LENGTH_SHORT).show();
        }
    }
}

Step 5. Define openCamera() (camera intent) method

/* MainActivity.java */

private void openCamera() {
    // Sets path to MediaStore (gallery)
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE,"New Picture");
    values.put(MediaStore.Images.Media.DESCRIPTION, "From the camera");
    image_uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

    // intent
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, image_uri);
    startActivityForResult(cameraIntent, IMAGE_CAPTURE_CODE);
}

Step 6. Set URI of ImageView resource after successful return from Camera intent

/* MainActivity.java */

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        mImageView.setImageURI(image_uri);
    }
}

Source code

https://github.com/tuttelikz/CameraSimple