Работаем с камерой в Android
Главная » Работаем с камерой в Android

Все современные смартфоны оборудованы камерами для съемки. Более того, мощность и качество этих камер постоянно растет. Уже сейчас очень многие люди вполне могут отказаться от фотоаппаратов, как отдельных устройств (хотя, конечно, смартфонам до них еще далеко) так как их вполне устраивают снимки полученные на мобильную камеру. 

Существует масса приложений в которых происходит работа с камерой устройства и в этом уроке мы тоже научимся использовать камеру устройства в своих приложениях.

Создаем новый проект, берем Blank Activity. Сразу давайте импортируем в проект нужные строки:

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

Они позволят нам делать захват изображения, его сохранение и высвечивать на экран пользователя. 

Теперь давайте добавим строковые ресурсы, которые будут использоваться в приложении. Открываем файл strings.xml и добавляем туда строки:

<string name="set1">Захват изображения</string>
<string name="set2">Изображение</string>
<string name="set3">Запустить камеру</string>

Перейдем к работе над интерфейсом программы. Открываем файл activity_main.xml. Нам нужно создать 3 элемента: TextView, кнопку для запуска камеры Button и элемент для отображения фото ImageView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">

 <TextView
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/set1"
 android:id="@+id/text"/>

 <Button
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/set3"
 android:id="@+id/bs"/>
 
 <ImageView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/pic"
 android:contentDescription="@string/set2"
 android:background="@drawable/border"/>
 
</LinearLayout>

Для ImageView установлен фон @drawable/border и эта строка сейчас подсвечивается красным, потому, что такого файла border у нас пока нету. Его нужно создать. Этот файл будет задавать вид для ImageView. Для того, чтобы он корректно отображался во всех возможных случаях, этот файл нужно создать для каждой папки drawable (то есть, drawabledrawable-hdpidrawable-mdpidrawable-xhdpidrawable-xxhdpi). Сделаем так, создаем файл border.xml в папке drawable. Он будет содержать следующее:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:dither="true">
 
 <gradient
 android:startColor="#99ffffff"
 android:endColor="#99ffffff"
 android:centerColor="#00000000"
 android:angle="90" />
 
 <padding 
 android:left="10dp"
 android:top="10dp"
 android:right="10dp" 
 android:bottom="10dp" />
 <corners android:radius="5dp" />
 
 <stroke
 android:width="2dp"
 android:color="#ccffffff" />
 
</shape>

Получился вот такой вот вид:

Берем этот код, копируем в блокнот, создаем в каждой из drawable папок, указанных выше, файл border.xml и кидаем в них этот же код (ищем эти папки вручную в файлах приложения и вручную создаем файлики).

На данный момент интерфейс нашей программы выглядит так:

Camera application

Добавим нашей кнопке в activitymain.xml нажатие:

<Button
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/set3"
 android:id="@+id/bs"
 android:onClick="Photo"/>

И добавим метод описания этого нажатия. Ставим курсор на "Photo", жмем Atl+Enter и выбираем верхнюю строку:

Переходим к работе в файле MainActivity.java. В методе onCreate заявляем о существовании нашей кнопки:

Button button=(Button)findViewById(R.id.bs);

Теперь переходим к самому интересному - настроим запуск камеры по нажатию на кнопку"Запустить камеру". До метода onCreate задаем использование следующих переменных:

//Переменная для установления связи между приложением и камерой
 private int CAMERA_CAPTURE;
 //Дает возможность обратиться к захваченному камерой изображению
 private Uri pUri;
 //Будет использоваться при захвате изображения
 final int PIC_CROP = 2;

В методе Photo (обработки нажатия) добавляем намерение использовать камеру и работать с полученными с нее данными:

try {
 //Используем стандартное системное намерение на использование камеры:
 Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 //Задаем возможность работать с полученными с камеры данными:
 startActivityForResult(captureIntent, CAMERA_CAPTURE);

Когда будет выполняться эта часть кода, будет запускаться камера и пользователь может сделать фото. Но нужно также предупредить ситуацию, когда устройство пользователя не может выполнять это действие, сделаем это с помощью всплывающего сообщения Toast (вспоминаем урок:)). Для этого добавляем в методе Photo следующее:

catch(ActivityNotFoundException cant){
 //Показываем сообщение об ошибке:
 String errorMessage = "Ваше устройство не поддерживает работу с камерой!";
 Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
 toast.show();
 }

Следующим шагом нужно научить программу извлекать полученное камерой изображение. Ниже метода "Photo"  добавляем метод onActivityResult (ставим курсор на пространство ниже метода "Photo", жмем на панели программы Code --- Override Methods, начинаем вводить имя метода, подсказки вам его укажут). Добавляем в него следующее:

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_CAPTURE){
//Получаем ссылку на захваченное изображение:
pUri=data.getData();
//Добавляем метод для передачи изображения в приложение:
cropImage();
}
}

Сейчас строка cropImage(); подсвечена красным, ставим на нее курсор и Android Studio предлагаем нам создать метод cropImage, соглашаемся:

Переходим к работе в этом методе. Добавляем сюда намерение работы с изображением, учтем, как и выше, случаи когда устройство не поддерживает таких функций:

 try {

 }
 catch(ActivityNotFoundException cant){
 //Показываем сообщение об ошибке:
 String errorMessage = "Ваше устройство не поддерживает работу с камерой!";
 Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
 toast.show();
 }

Дальше добавляем код, который будет указывать приложению извлекать изображение после его захвата (извлечение данных с камеры в приложение) , задавать захваченному камерой изображению различные характеристики:

//Вызываем стандартное действие захвата изображения:
 Intent cropIntent = new Intent("com.android.camera.action.CROP");
 //Указываем тип изображения и Uri
 cropIntent.setDataAndType(pUri, "image/*");
 //Настраиваем характеристики захвата:
 cropIntent.putExtra("crop", "true");
 cropIntent.putExtra("aspectX", 1);
 cropIntent.putExtra("aspectY", 1);
 //Указываем размер в X and Y
 cropIntent.putExtra("outputX", 256);
 cropIntent.putExtra("outputY", 256);
 //Извлекаем данные
 cropIntent.putExtra("return-data", true);
 //Запускаем Activity и возвращаемся в метод onActivityResult
 startActivityForResult(cropIntent, PIC_CROP);

Ну и под конец, нужно настроить отображение полученного с камеры изображения. В методе 'onActivityResult' после оператора if добавим оператор else, в котором опишем действия для программы по возвращению от действий захвата изображения:

else if (requestCode == PIC_CROP) { 
}

И добавляем в этот оператор следующий код:

else if (requestCode == PIC_CROP) {
 //Получаем данные
 Bundle extras = data.getExtras();
 //Получаем изображение
 Bitmap thePic = extras.getParcelable("data");
 //Создаем ссылку на наш элемент ImageView в activity_main.xml:
 ImageView picView = (ImageView)findViewById(R.id.pic);
 //Отображаем в нем полученное с камеры изображение:
 picView.setImageBitmap(thePic);

 }

Чтобы вы не потеряли ничего с необходимого кода, вот весь код файла MainActivity.java:

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

 
 public class MainActivity extends Activity {
 //Переменная для установления связи между приложением и камерой
 private int CAMERA_CAPTURE;
 //Дает возможность обратиться к захваченному камерой изображению
 private Uri pUri;
 //Будет использоваться при захвате изображения
 final int PIC_CROP = 2;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 //Объявляем использование кнопки, привязываем к нашей кнопке:
 Button button=(Button)findViewById(R.id.bs);
 }

 //Описываем нажатие клавиши "Запустить камеру"
 public void Photo(View view) {
 try {
 //Используем стандартное системное намерение на использование камеры:
 Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 //Задаем возможность работать с полученными с камеры данными:
 startActivityForResult(captureIntent, CAMERA_CAPTURE);
 }
 catch(ActivityNotFoundException cant){
 //Показываем сообщение об ошибке:
 String errorMessage = "Ваше устройство не поддерживает работу с камерой!";
 Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
 toast.show();
 }
 }
 //Добавляем метод обработки данных с камеры (то есть изображения)
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 if (requestCode == CAMERA_CAPTURE){
 pUri=data.getData();
 cropImage();
 }

 else if (requestCode == PIC_CROP) {
 //Получаем данные
 Bundle extras = data.getExtras();
 //Получаем изображение
 Bitmap thePic = extras.getParcelable("data");
 //Создаем ссылку на наш элемент ImageView в activity_main.xml:
 ImageView picView = (ImageView)findViewById(R.id.pic);
 //Отображаем в нем полученное с камеры изображение:
 picView.setImageBitmap(thePic);

}
}

 private void cropImage() {
 try {
 }
 catch(ActivityNotFoundException cant){
 //Показываем сообщение об ошибке:
 String errorMessage = "Ваше устройство не поддерживает работу с камерой!";
 Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
 toast.show();
 }
 //Вызываем стандартное действие захвата изображения:
 Intent cropIntent = new Intent("com.android.camera.action.CROP");
 //Указываем тип изображения и Uri
 cropIntent.setDataAndType(pUri, "image/*");
 //Настраиваем характеристики захвата:
 cropIntent.putExtra("crop", "true");
 cropIntent.putExtra("aspectX", 1);
 cropIntent.putExtra("aspectY", 1);
 //Указываем размер в X и Y
 cropIntent.putExtra("outputX", 256);
 cropIntent.putExtra("outputY", 256);
 //Извлекаем данные:
 cropIntent.putExtra("return-data", true);
 //Запускаем Activity и возвращаемся в метод onActivityResult
 startActivityForResult(cropIntent, PIC_CROP);

 }
}

Все готово! Приступаем к тестированию приложения. Как вы поняли, тест на эмуляторе ничего не даст, нужно устройство с реальной камерой. 

Вот оригинал этого урока.

Категория: Уроки программирования | Просмотров: 1145 | Добавил: Oleg | Теги: сохраняем фото, приложение Android, камера, фотография, делаем фото | Рейтинг: 0.0/0
Всего комментариев: 0
avatar