Как получить снимок с камеры в Android приложении

Создание Android приложения

Android CameraПрограммирование для Android подразумевает решение очень широкого круга задач, и хотя использование камеры - не самая распространенная из них, тем не менее на тематических форумах довольно часто встречаются вопросы, связанные с этой темой.  Давайте для примера разработаем простую программу, демонстрирующую использование встроенного в android приложения для работы с камерой для получения снимка. Логика работы нашего приложения будет довольно проста: при нажатии на кнопку у нас будет запускаться стандартная программа для работы с камерой. После того, как мы сделаем  снимок и закроем это приложение, результат будет отображаться в ImageView. Ниже приводится код файла манифеста и макета заготовки нашего приложения

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.mobilab.sample"
android:versionCode="1"
android:versionName="1.0" >
 
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MlCameraSampleActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
 
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
package ru.mobilab.sample;
 
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
 
publicclass MlCameraSampleActivityextends Activity{
/** Called when the activity is first created. */
 
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
 
final Button button1=(Button) findViewById(R.id.button1);
button1.setOnClickListener(button_click);
}
 
public OnClickListener button_click=new OnClickListener(){
 
public void onClick(View v){
// TODO Auto-generated method stub
}
};
}

Запускаем приложение для работы с Android камерой


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

android.provider.MediaStore.ACTION_IMAGE_CAPTURE

Давайте создадим его внутри метода button_click :

Intent cameraIntent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

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

Обычно интенты запускаются с помощью метода startActivity(), однако в случае, когда приложение ждет от интента какого-то результата, необходимо использовать метод startActivityForResult(). Для того, чтобы получить от стандартного приложения камеры снимок, мы должны запустить интент следующим образом:

startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

После того как пользователь сделал снимок и завершил Activity камеры, картинка будет доступна через метод onActivityResult(). Вам нужно переопределить этот callback метод внутри своего приложения:

protected void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode== CAMERA_PIC_REQUEST){
// do something
}
}
 

И снова, CAMERA_PIC_REQUEST - это константа, которую нужно определить в своем приложении и ее значение будет ассоциироваться с результатом, возвращаемым интентом:

private static final int CAMERA_PIC_REQUEST=1112;


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

Получаемое в результате изображение адаптировано для показа на маленьком экране телефона и представлено в виде объекта Bitmap

 Bitmap thumbnail=(Bitmap) data.getExtras().get("data");

Для того чтобы показать это изображение в ImageView нужно воспользоваться методом setImageBitmap().

ImageView image=(ImageView) findViewById(R.id.photoResultView);
image.setImageBitmap(thumbnail);

В результате всех наших манипуляций наш java проект будет иметь вид:

package ru.mobilab.sample;
 
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
 
publicclass MlCameraSampleActivityextends Activity{
/** Called when the activity is first created. */
private static final int CAMERA_PIC_REQUEST=1112;
 
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
 
final Button button1=(Button) findViewById(R.id.button1);
button1.setOnClickListener(button_click);
}
 
public OnClickListener button_click=new OnClickListener(){
 
public void onClick(View v){
// TODO Auto-generated method stub
Intent cameraIntent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
 
}
};
 
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode== CAMERA_PIC_REQUEST){
Bitmap thumbnail=(Bitmap) data.getExtras().get("data");
ImageView image=(ImageView) findViewById(R.id.imageView1);
image.setImageBitmap(thumbnail);
}
}
}

И не забудьте про разрешения. Чтобы приложение заработало нужно добавить в uses-permission значение android.permission.CAMERA.

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

Как видите, добавить поддержку камеры в свое приложение очень просто, однако не все пользователи имеют телефоны с камерой. К счастью есть простой способ решения этой проблемы. Нужно просто запретить устанавливать это приложение таким пользователям. Для этого нужно использовать тег <uses-feature> в манефесте Вашего приложения:

<uses-feature android:name="android.hardware.camera"></uses-feature>

После добавления этой строки Ваше приложение не будет показываться пользователям без камеры в Google Play Market. Тем не менее, <uses-feature> вовсе не запрещает прямую установку приложения на неподходящий телефон - это просто фильтр для Google Play Market.

Исходник проекта

Источник:Lauren Darcey and Shane Conder "Android SDK Quick Tip: Launching the Camera"
Перевод и адаптация:Александр Ледков




Наши соцсети

Подписаться Facebook Подписаться Вконтакте Подписаться Twitter Подписаться Google Подписаться Telegram

Популярное

Ссылки

интернет на день
Новости [1] [2] [3]... Android/ iOS/ J2ME[1] [2] [3]) Android / Архив

Рейтинг@Mail.ru Яндекс.Метрика
MobiLab.ru © 2005-2018
При использовании материалов сайта ссылка на www.mobilab.ru обязательна