Accessing the Camera and Capturing Images/Videos in Android Development


Accessing the camera and capturing images or videos is a common requirement in Android applications. Android provides several ways to interact with the camera, including using the default camera app, capturing images and videos directly, or using third-party libraries. In this article, we'll explore how to access the camera and capture media using Kotlin.

Permissions

Before accessing the camera, you need to declare the necessary permissions in your AndroidManifest.xml file. For accessing the camera and saving images/videos, add the following permissions:

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

Capturing an Image

In this example, we will demonstrate how to capture an image using the camera and display it in an ImageView.

Step 1: Define the Camera Intent

We can use an Intent to launch the camera app to capture an image. This is done using the MediaStore.ACTION_IMAGE_CAPTURE action.

    import android.content.Intent
    import android.graphics.Bitmap
    import android.os.Bundle
    import android.provider.MediaStore
    import android.widget.ImageView
    import androidx.appcompat.app.AppCompatActivity

    class MainActivity : AppCompatActivity() {

        private val cameraRequestCode = 1001
        private lateinit var imageView: ImageView

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            imageView = findViewById(R.id.imageView)

            // Start the camera intent when button is clicked
            findViewById

Explanation:

  • The Intent with MediaStore.ACTION_IMAGE_CAPTURE starts the camera app.
  • When the user captures an image, the result is returned to the onActivityResult method.
  • The captured image is retrieved as a Bitmap and displayed in an ImageView.

Capturing a Video

In this section, we will capture a video using the camera and save it to the device.

Step 1: Define the Video Capture Intent

Similar to capturing an image, we can use an Intent to launch the camera app to record a video. This is done using the MediaStore.ACTION_VIDEO_CAPTURE action.

    import android.content.Intent
    import android.net.Uri
    import android.os.Bundle
    import android.provider.MediaStore
    import android.widget.Button
    import android.widget.VideoView
    import androidx.appcompat.app.AppCompatActivity

    class MainActivity : AppCompatActivity() {

        private val videoRequestCode = 1002
        private lateinit var videoView: VideoView

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            videoView = findViewById(R.id.videoView)

            // Start the camera intent when button is clicked
            findViewById

Explanation:

  • The Intent with MediaStore.ACTION_VIDEO_CAPTURE starts the camera app for video recording.
  • When the video is captured, the result is returned to the onActivityResult method.
  • The video URI is retrieved and set to a VideoView to display the video.

Saving Captured Media

If you want to save the captured image or video to the device's storage, you can use the MediaStore API for managing images and videos.

    import android.content.ContentValues
    import android.provider.MediaStore
    import android.content.ContentResolver
    import android.os.Environment
    import android.util.Log
    import java.io.OutputStream
    import java.io.File

    fun saveCapturedImage(bitmap: Bitmap): Uri {
        val contentResolver: ContentResolver = context.contentResolver
        val contentValues = ContentValues().apply {
            put(MediaStore.Images.Media.TITLE, "CapturedImage")
            put(MediaStore.Images.Media.DESCRIPTION, "Captured via Camera")
            put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
            put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis())
        }
        val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
        val outputStream: OutputStream? = contentResolver.openOutputStream(uri!!)
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)
        outputStream?.close()
        return uri
    }
        

This function saves the image to the device’s external storage by inserting it into the MediaStore and compressing it as a JPEG.

Using Third-Party Libraries

For more advanced functionality like cropping images or working with the camera directly, you can use third-party libraries such as CameraX, Picasso, or Glide. These libraries simplify handling camera interactions and provide more flexibility.

Conclusion

Accessing the camera and capturing images/videos in Android can be done using Intents to launch the default camera app or using more complex third-party libraries for direct camera control. With the examples provided above, you can easily implement basic camera functionality in your app using Intent for image and video capture, along with the necessary permissions. For advanced use cases, consider using libraries like CameraX for more control over the camera features.





Advertisement