Программирование для 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 новые деятельности и службы запускаются с помощью, так называемых интентов (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"
Перевод и адаптация:Александр Ледков