Как открыть камеру через намерение и отобразить захваченное изображение в Android?
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" ?> 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) } } } |