Как открыть камеру через намерение и отобразить захваченное изображение в Android?

Опубликовано: 11 Января, 2023

Pre-requisites: 

  • Android App Development Fundamentals for Beginners 
  • Guide to Install and Set up Android Studio 
  • Android | Starting with first app/android project 
  • Android | Running your first Android app 

Цель этой статьи — показать, как открыть камеру из приложения и щелкнуть изображение, а затем отобразить это изображение в том же приложении. Для этого в этой статье было разработано приложение для Android. Открытие камеры изнутри нашего приложения достигается с помощью класса ACTION_IMAGE_CAPTURE Intent класса MediaStore .

На этом изображении показано изображение, щелкнутое камерой и установленное в Imageview. Когда приложение открыто, оно отображает кнопку «Камера», чтобы открыть камеру. При нажатии Intent ACTION_IMAGE_CAPTURE запускается классом MediaStore. Когда изображение захвачено, оно отображается в окне просмотра изображения.

Как создать приложение для открытия камеры с помощью Intent и отображения захваченного изображения

Пошаговая реализация

Шаг 1. Создайте новый проект в Android Studio.

Чтобы создать новый проект в Android Studio, обратитесь к разделу «Как создать/запустить новый проект в Android Studio». Код для этого был предоставлен как на Java, так и на языке программирования Kotlin для Android. Это создаст файл XML «activity_main.xml» и файл Java «MainActivity.Java». Пожалуйста, обратитесь к предварительным требованиям, чтобы узнать больше об этом шаге.

Шаг 2: Работа с файлами XML

Далее перейдите к файлу activity_main.xml , представляющему UI проекта. Ниже приведен код файла activity_main.xml . Комментарии добавляются внутри кода, чтобы понять код более подробно.

  • Кнопка для открытия камеры
  • ImageView для отображения захваченного изображения

Кроме того, назначьте идентификатор каждому компоненту вместе с другими атрибутами, как показано на изображении и в коде ниже.

Синтаксис:

android:id="@+id/id_name"

Здесь заданы следующие идентификаторы:

  • Кнопка камеры: camera_button
  • Изображение: click_image

На этом шаге будет создан пользовательский интерфейс приложения.

XML




<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">
  
    <!-- add Camera Button to open the Camera -->
    <Button
        android:id="@+id/camera_button"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_marginLeft="140dp"
        android:text="Camera" />
  
    <!-- add ImageView to display the captured image -->
    <ImageView
        android:id="@+id/click_image"
        android:layout_width="350dp"
        android:layout_height="450dp"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="70dp"
        android:layout_marginBottom="10dp" />
</RelativeLayout>

Шаг 3: Работа с файлом MainActivity

Перейдите в файл MainActivity и обратитесь к следующему коду. Ниже приведен код файла MainActivity. Комментарии добавляются внутри кода, чтобы понять код более подробно. Мы будем создавать экземпляры компонентов, созданных в файле XML (кнопка камеры, ImageView), используя метод findViewById(). Этот метод привязывает созданный объект к компонентам пользовательского интерфейса с помощью назначенного идентификатора.

Общий синтаксис:

ComponentType object = (ComponentType)findViewById(R.id.IdOfTheComponent);

Синтаксис используемых компонентов:

Button camera_open_id= findViewById(R.id.camera_button); 
ImageView click_image_id = findViewById(R.id.click_image); 

Настройка операций с кнопкой камеры и ImageView.

Во-первых, определите переменную pic_id, которая является идентификатором запроса изображения, на которое нажали.

Это делается следующим образом:

private static final int pic_id = 123

Добавьте прослушиватель на кнопку камеры. Это будет использоваться для открытия камеры, когда пользователь нажимает на кнопку.

Это делается следующим образом:

camera_open_id.setOnClickListener(new View.OnClickListener() {}

Теперь создайте намерение ACTION_IMAGE_CAPTURE, предоставленное MediaStore. Это намерение поможет открыть камеру для захвата изображения. Начните намерение с запрошенного pic_id.

Это делается следующим образом:

Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(camera_intent, pic_id); 

Теперь используйте метод onActivityResult(), чтобы получить результат, вот захваченное изображение.

Это делается следующим образом:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { } 
 

Затем установите изображение, полученное в результате намерения камеры, в ImageView для отображения.

Bitmap photo = (Bitmap) data.getExtras().get("data");
clicked_image_id.setImageBitmap(photo);

Java




import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.widget.Button;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;
  
public class MainActivity extends AppCompatActivity {
  
    // Define the pic id
    private static final int pic_id = 123;
    // Define the button and imageview type variable
    Button camera_open_id;
    ImageView click_image_id;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // By ID we can get each component which id is assigned in XML file get Buttons and imageview.
        camera_open_id = findViewById(R.id.camera_button);
        click_image_id = findViewById(R.id.click_image);
  
        // Camera_open button is for open the camera and add the setOnClickListener in this button
        camera_open_id.setOnClickListener(v -> {
            // Create the camera_intent ACTION_IMAGE_CAPTURE it will open the camera for capture the image
            Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // Start the activity with camera_intent, and request pic id
            startActivityForResult(camera_intent, pic_id);
        });
    }
  
    // This method will help to retrieve the image
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Match the request "pic id with requestCode
        if (requestCode == pic_id) {
            // BitMap is data structure of image file which store the image in memory
            Bitmap photo = (Bitmap) data.getExtras().get("data");
            // Set the image in imageview for display
            click_image_id.setImageBitmap(photo);
        }
    }
}

Kotlin




import android.content.Intent
import android.graphics.Bitmap
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Button
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
  
class MainActivity : AppCompatActivity() {
      
    // Define the button and imageview type variable
    lateinit var camera_open_id: Button
    lateinit var click_image_id: ImageView
  
    companion object {
        // Define the pic id
        private const val pic_id = 123
    }
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // By ID we can get each component which id is assigned in XML file get Buttons and imageview.
        camera_open_id = findViewById(R.id.camera_button)
        click_image_id = findViewById(R.id.click_image)
  
        // Camera_open button is for open the camera and add the setOnClickListener in this button
        camera_open_id.setOnClickListener {
            // Create the camera_intent ACTION_IMAGE_CAPTURE it will open the camera for capture the image
            val camera_intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
                Intent(MediaStore.ACTION_IMAGE_CAPTURE)
            } else {
                TODO("VERSION.SDK_INT < CUPCAKE")
            }
            // Start the activity with camera_intent, and request pic id
            startActivityForResult(camera_intent, pic_id)
        }
    }
  
    // This method will help to retrieve the image
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        // Match the request "pic id with requestCode
        if (requestCode == pic_id) {
            // BitMap is data structure of image file which store the image in memory
            val photo = data!!.extras!!["data"] as Bitmap?
            // Set the image in imageview for display
            click_image_id.setImageBitmap(photo)
        }
    }
}

Выход: