سلام عزیزان ، در این قسمت به آموزش کار با دوربین در اندروید میپردازیم.دو راه برای استفاده از دوربین در برنامه ی شما وجود داردکه آن دو راه عبارتند از

۱) استفاده از برنامه ی دوربین اندروید موجود در برنامه ی خود .

۲) استفاده مستقیم از دوربین API در اندروید که در برنامه ی شما ارائه شده است.

استفاده از دوربین اندروید موجود در برنامه

شما برای آغاز برنامه ی نصب شده ی دور بین روی گوشی خود از MediaStore.ACTION_IMAGE_CAPTURE استفاده می کنید، که ترکیب آن به شکل زیر می باشد.

Intent intent = new ‎Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

علاوه بر مورد بالا Intent های دیگری وجود دارند که توسط MediaStore ارائه می شوند که در زیر لیست شده اند.

شماره

Intent type and description

۱

ACTION_IMAGE_CAPTURE_SECURE

زمانی که دستگاه ایمن شده باشد، تصویر گرفته شده را به دوربین بازمی گرداند.

۲

ACTON_VIDEO_CAPTURE

برنامه ی video موجود در اندروید را فرامی خواند تا فیلم بگیدرد.

۳

EXTRA_SCREEN_ORIENTATION

جهت صفحه را به صورت عمودی یا منظره تنظیم می کند.

۴

EXTRA_FULL_SCREEN

برای کنترل اینترفیس یوزر از ViewImage استفاده می شود.

۵

INTENT_ACTION_VIDEO_CAMERA

برای آغاز کار دوربین در حالت ویدیو استفاده می شود.

۶

EXTRA_SIZE_LIMIT

برای تعیین محدودیت اندازه ی تصویر یا فیلم گرفته شده استفاده می شود.

اکنون شما از عملکرد startActivityForResult() برای آغاز این فعالیت استفاده کرده و منتظر نتیجه می مانید. ترکیب آن در زیر ارائه شده است.

startActivityForResult(intent,0)

این روش در گروه Activity تعریف شده است، که آن را از فعالیت اصلی فرا می خوانیم. روش های تعریف شده ای در گروه Activity وجود دارند که همین کار را انجام می دهند اما زمانی استفاده می شوند که نه از گروه activity بلکه از جایی دیگر فراخوانده اید. می توانید لیست آنها را در زیر ببینید.

شماره

توضیح عملکرد فعالیت

۱

startActivityForResult(Intent intent, int requestCode, Bundle options)

یک فعالیت را آغاز می کند اما می تواند گروهی از گزینه های اضافه را با آن بگیرد.

۲

startActivityFromChild(Activity child, Intent intent, int requestCode)

فعالیت را زمانی که فعالیت شما زیرمجموعه ی هر فعالیت دیگری است، آغاز می کند.

۳

startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options)

درست مانند بالا عمل می کند اما می تواند مقادیر اضافه را با آن به شکل یک دسته بگیرد.

۴

startActivityFromFragment(Fragment fragment, Intent intent, int requestCode)

فعالیت را از بخشی آغاز می کند که اکنون در آن هستید.

۵

startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options)

نه تنها فعالیت را از بخش آغاز می کند بلکه می تواند مقادیر اضافه را با آن بگیرد.

مهم نیست از کدام عملکرد برای آغاز فعالیت استفاده می کنید، همه ی آنها نتیجه را بازمی گردانند. نتیجه می تواند با تحت الشعاع قراردادن عملکرد onActivityResult به دست آید.

مثال

در اینجا مثالی را می بینید که نشان می دهد چگونه برنامه ی دوربین موجود را برای گرفتن عکس آغاز کنید و نتیجه را به شکل bitmap نمایش می دهد.

برای اجرای این مثال به دستگاهی نیاز دارید که در آن دوربین ساپورت می شود.

مراحل

Description

۱

برای ایجاد یک برنامه ی اندروید از Eclipse IDE استفاده خواهید کرد و آن را با عنوان Camera تحت بسته ی com.example.camera نام گذاری کنید. زمان ایجاد این برنامه مطمئن شوید که Target SDK و Compile With در آخرین ورژن Android SDK هستند تا از سطوح بالاتر API استفاده کنید.

۲

فایل src/MainActivity.java را برای افزودن کد intent تغییر دهید تا فعالیت و روش نتیجه را برای دریافت خروجی آغاز کنید.

۳

لی اوت فایل XML مربوط به res/layout/activity_main.xml را تغییر دهید و اگر لازم است مولفه ی GUI را اضافه کنید.

۴

برای تعریف مقادیر ثابت لازم res/values/strings.xml را تغییر دهید.

۵

برنامه را اجرا کنید و یک دستگاه اجرایی اندروید انتخاب کنید و برنامه را روی آن نصب کرده و نتایج را بررسی کنید.

در زیر محتوای تغییر یافته ی فعالیت اصلی را مشاهده می کنید.

src/com.example.camera/MainActivity.java.‎

package com.example.camera;‎

import android.os.Bundle;‎

import android.app.Activity;‎

import android.content.Intent;‎

import android.graphics.Bitmap;‎

import android.view.Menu;‎

import android.view.View;‎

import android.view.View.OnClickListener;‎

import android.widget.ImageView;‎

public class MainActivity extends Activity {‎

ImageView imgFavorite;‎

‎ @Override

‎ protected void onCreate(Bundle savedInstanceState) {‎

‎ super.onCreate(savedInstanceState);‎

‎ setContentView(R.layout.activity_main);‎

‎ imgFavorite = (ImageView)findViewById(R.id.imageView1);‎

‎ imgFavorite.setOnClickListener(new OnClickListener() {‎

‎ @Override

‎ public void onClick(View v) {‎

‎ open();‎

‎ }‎

‎ });‎

‎ }‎

‎ public void open(){‎

‎ Intent intent = new ‎Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);‎

‎ startActivityForResult(intent, 0);‎

‎ }‎

‎ @Override

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

‎ // TODO Auto-generated method stub

‎ super.onActivityResult(requestCode, resultCode, data);‎

‎ Bitmap bp = (Bitmap) data.getExtras().get(“data”);‎

‎ imgFavorite.setImageBitmap(bp);‎

‎ }‎

‎ @Override

‎ public boolean onCreateOptionsMenu(Menu menu) {‎

‎ // Inflate the menu; this adds items to the action bar ‎if it is present.‎

‎ getMenuInflater().inflate(R.menu.main, menu);‎

‎ return true;‎

‎ }‎

‎}

در زیر محتوای res/layout/activity_main.xml file را خواهید دید.

‎‎

‎ ‎

‎ ‎

در زیر محتوای res/values/strings.xml را برای تعریف یک مقدار ثابت مشاهده می کنید.

‎ Camera‎

‎ Settings‎

‎ Hello world!‎

‎ Tap the image to open the ‎camera!!‎

در زیر محتوای پیش فرض AndroidManifest.xml را می بینید.

‎‎

‎ ‎

‎ ‎

‎ ‎

‎ ‎

‎ ‎

اجازه بدهید برنامه ی Camera را اجرا کنیم. فرض می کنیم که دستگاه موبایل اندروید خود را به کامپیوتر متصل کرده اید. برای اجرای برنامه از Eclipse، یکی ازفایل های فعالیت پروژه را باز کرده و روی آیکن Run از تولبار کلیک کنید. قبل از شروع برنامه ی شما، Eclipse پنجره ی زیر را برای انتخاب گزینه ی محل اجرای برنامه ی اندرویدتان، نمایش خواهد داد.

دستگاه موبایل خود را به عنوان یک گزینه انتخاب کنید و سپس آن را چک کنید که صفحه ی زیر را نمایش خواهد داد.

اکنون روی تصویر آیکن اندروید ضربه بزنید وپس از آن دوربین باز خواهد شد. یک عکس بگیرید، پس از عکس گرفتن دو دکمه ظاهر می شود که می شود که می پرسد آیا عکس را حفظ می کنید یا آن را حذف می کنید.

روی دکمه ی تیک (سبزرنگ) ضربه بزنید که پس از آن به برنامه ی دوربین بازمی گردید که عکس گرفته شده جایگزین آیکن اندروید شده است.

استفاده مستقیم از دوربین API ارائه شده در برنامه ی اندروید.

ما از دوربین API برای کامل کردن برنامه ی دوربین استفاده خواهیم کرد.

ابتدا نیاز خواهید داشت تا با استفاده از روش استاتیک ارائه شده به وسیله api مقداردهی آبجکت دوربین را آغاز کنید. ترکیب آن به شکل زیر می باشد.

Camera object = null;‎

object = Camera.open();

علاوه برعملکرد بالا، عملکردهای دیگری توسط گروه camera ارائه می شوند که در زیر بیان شده اند.

شماره

روشها و توضیحات

۱

getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo)

اطلاعات مربوط به یک دوربین خاص را بازمی گرداند.

۲

getNumberOfCameras()

یک عدد صحیح که دوربین های حاضر روی دستگاه را تعریف می کند.

۳

lock()

برای قفل کردن دوربین استفاده می شود، بنابراین هیچ برنامه ی دیگری نمی تواند به آن دسترسی داشته باشد.

۴

release()

برای آزاد کردن قفل دوربین استفاده می شود، بنابراین دیگر برنامه ها می توانند به آن دسترسی داشته باشند.

۵

open(int cameraId)

برای باز کردن یک دوربین خاص، زمانیکه چند دوربین پشتیبانی می شوند، استفاده می شود.

۶

enableShutterSound(boolean enabled)

برای فعال یا غیرفعال کردن صدای پیش فرض شاتر دوربین در هنگام گرفتن عکس، استفاده می شود.

اکنون نیاز دارید که یک گروه مجزا بسازید و آن را با SurfaceView گسترش دهید و اینترفیس SurfaceHolder را اجرا کنید. دو گروهی که استفاده می شوند دارای اهداف زیر می باشند.

Class

Description

Camera

برای کنترل دوربین و گرفتن تصاویر یا ویدیو از دوربین استفاده می شود.

SurfaceView

این گروه برای نشان دادن یک پیش نمایش زنده از دوربین برای یوزر استفاده می شود.

شما باید روش پیش نمایش گروه دوربین را برای آغاز پیش نمایش برای یوزر فرا بخوانید.

public class ShowCamera extends SurfaceView implements ‎SurfaceHolder.Callback {‎

‎ private Camera theCamera;‎

‎ public void surfaceCreated(SurfaceHolder holder) {‎

‎ theCamera.setPreviewDisplay(holder);‎

‎ theCamera.startPreview();‎

‎ }‎

‎ public void surfaceChanged(SurfaceHolder arg0, int arg1, ‎int arg2, int arg3){‎

‎ }‎

‎ public void surfaceDestroyed(SurfaceHolder arg0) {‎

‎ }‎

‎}

علاوه برپیش نمایش، آپشن های دیگری برای دوربین وجود دارد که می تواند با استفاده از عملکردهای دیگر که توسط Camera API ارائه می شوند، تنظیم شود.

شماره

روشها و توضیحات

۱

startFaceDetection()

این عملکرد کشف صورت در دوربین را آغاز می کند.

۲

stopFaceDetection()

برای متوقف کردن عملیات کشف صورت که با عملکرد بالا فعال شده، استفاده می شود.

۳

startSmoothZoom(int value)

یک مقدار صحیح را می گیرد و دوربین به آرامی روی آن مقدار زوم می کند.

۴

stopSmoothZoom()

برای متوقف کردن زوم دوربین استفاده می شود.

۵

stopPreview()

برای متوقف کردن پیش نمایش برای یوزر استفاده می شود.

۶

takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)

برای فعال یا غیرفعال کردن صدای پیش فرض شاتل در هنگام گرفتن عکس استفاده می شود.

مثال

مثال زیر استفاده ی camera API را در برنامه توضیح می دهد.

برای آزمایش با این مثال به یک دستگاه موبایل مجهز شده با آخرین ورژن Android OS نیاز دارید، زیرا مقلد دوربین را پشتیبانی نمی کند.

مراحل

Description

۱

برای ایجاد یک برنامه ی اندروید از Eclipse IDE استفاده خواهید کرد و آن را با عنوان Camera تحت بسته ی com.example.camera1 نام گذاری کنید. زمان ایجاد این برنامه مطمئن شوید که Target SDK و Compile With در آخرین ورژن Android SDK هستند تا از سطوح بالاتر API استفاده کنید.

۲

فایل src/MainActivity.java را برای افزودن کد مربوط به دوربین و به دست آوردن مراجع مولفه های XML، تغییر دهید

۳

یک فایل جدید ShowCamera.java برای گسترش آن با SurfaceView و اجرای اینترفیس SurfaceHolder، ایجاد کنید.

۴

فایل لی اوت XML مربوط به res/layout/activity_main.xml را تغییر دهید، اگر لازم است مولفه ی GUI به آن اضافه کنید. در اینجا ما فقط یک FrameView، یک دکمه و یک ImageView اضافه می کنیم.

۵

res/values/strings.xml را تغییر دهید تا مقادیر ثابت لازم را تعریف کنید.

۶

AndroidManifest.xml را همانطور که در زیر نمایش داده شده، تغییر دهید تا دستورات لازم برای دوربین را اضافه کنید.

۷

برنامه را اجرا کنید و یک دستگاه اجرایی اندروید انتخاب کنید و برنامه را روی آن نصب کرده و نتایج را بررسی کنید.

در زیر محتوای فایل تغییر یافته ی فعالیت اصلی را مشاهده می کنید.

src/com.example.camera1/MainActivity.java.‎

package com.example.camera1;‎

import android.graphics.Bitmap;‎

import android.graphics.BitmapFactory;‎

import android.hardware.Camera;‎

import android.hardware.Camera.PictureCallback;‎

import android.os.Bundle;‎

import android.app.Activity;‎

import android.view.Menu;‎

import android.view.View;‎

import android.widget.FrameLayout;‎

import android.widget.ImageView;‎

import android.widget.Toast;‎

public class MainActivity extends Activity {‎

‎ private Camera cameraObject;‎

‎ private ShowCamera showCamera;‎

‎ private ImageView pic;‎

‎ public static Camera isCameraAvailiable(){‎

‎ Camera object = null;‎

‎ try {‎

‎ object = Camera.open(); ‎

‎ }‎

‎ catch (Exception e){‎

‎ }‎

‎ return object; ‎

‎ }‎

‎ private PictureCallback capturedIt = new PictureCallback() ‎‎{‎

‎ @Override

‎ public void onPictureTaken(byte[] data, Camera camera) {‎

‎ Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, ‎data .length);‎

‎ if(bitmap==null){‎

‎ Toast.makeText(getApplicationContext(), “not taken”, ‎Toast.LENGTH_SHORT).show();‎

‎ }‎

‎ else

‎ {‎

‎ Toast.makeText(getApplicationContext(), “taken”, ‎Toast.LENGTH_SHORT).show(); ‎

‎ }‎

‎ cameraObject.release();‎

‎ }‎

‎};‎

‎ @Override

‎ protected void onCreate(Bundle savedInstanceState) {‎

‎ super.onCreate(savedInstanceState);‎

‎ setContentView(R.layout.activity_main);‎

‎ pic = (ImageView)findViewById(R.id.imageView1);‎

‎ cameraObject = isCameraAvailiable();‎

‎ showCamera = new ShowCamera(this, cameraObject);‎

‎ FrameLayout preview = (FrameLayout) ‎findViewById(R.id.camera_preview);‎

‎ preview.addView(showCamera);‎

‎ }‎

‎ public void snapIt(View view){‎

‎ cameraObject.takePicture(null, null, capturedIt);‎

‎ }‎

‎ @Override

‎ public boolean onCreateOptionsMenu(Menu menu) {‎

‎ getMenuInflater().inflate(R.menu.main, menu);‎

‎ return true;‎

‎ }‎

‎}

فایل جدید جاوا با نام src/com.example.camera1/ShowCamera.java. را ایجاد کنید و کد زیر را به آن اضافه کنید.

package com.example.camera1;‎

import java.io.IOException;‎

import android.content.Context;‎

import android.hardware.Camera;‎

import android.view.SurfaceHolder;‎

import android.view.SurfaceView;‎

public class ShowCamera extends SurfaceView implements ‎SurfaceHolder.Callback {‎

‎ private SurfaceHolder holdMe;‎

‎ private Camera theCamera;‎

‎ public ShowCamera(Context context,Camera camera) {‎

‎ super(context);‎

‎ theCamera = camera;‎

‎ holdMe = getHolder();‎

‎ holdMe.addCallback(this);‎

‎ }‎

‎ @Override

‎ public void surfaceChanged(SurfaceHolder arg0, int arg1, ‎int arg2, int arg3) {‎

‎ }‎

‎ @Override

‎ public void surfaceCreated(SurfaceHolder holder) {‎

‎ try {‎

‎ theCamera.setPreviewDisplay(holder);‎

‎ theCamera.startPreview(); ‎

‎ } catch (IOException e) {‎

‎ }‎
‎ }‎

‎ @Override

‎ public void surfaceDestroyed(SurfaceHolder arg0) {‎

‎ }‎

‎}

محتوای res/layout/activity_main.xml را تغییر دهید.

‎ ‎

‎ ‎