سبد (0)

آموزش دوربین در اندروید

آموزش دوربین اندروید

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

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

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

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

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

 

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

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

  • 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 نمایش می دهد.

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

  • برای ایجاد یک برنامه ی اندروید از 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 را تغییر دهید.

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

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

 

package com.example.sairamkrishna.myapplication;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;

import android.graphics.Bitmap;
import android.os.BatteryManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Set;

public class MainActivity extends ActionBarActivity {
   Button b1,b2;
   ImageView iv;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      b1=(Button)findViewById(R.id.button);
      iv=(ImageView)findViewById(R.id.imageView);
      
      b1.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 0);
         }
      });
   }
   
   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");
      iv.setImageBitmap(bp);
   }
   
   @Override
   protected void onDestroy() {
      super.onDestroy();
   }
   
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.menu_main, menu);
      return true;
   }
   
   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      // Handle action bar item clicks here. The action bar will
      // automatically handle clicks on the Home/Up button, so long
      // as you specify a parent activity in AndroidManifest.xml.
      
      int id = item.getItemId();
      
      //noinspection SimplifiableIfStatement
      if (id == R.id.action_settings) {
         return true;
      }
      return super.onOptionsItemSelected(item);
   }
}

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

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
   android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
   
   <TextView android:text="Camera Example" android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/textview"
      android:textSize="35dp"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point"
      android:id="@+id/textView"
      android:layout_below="@+id/textview"
      android:layout_centerHorizontal="true"
      android:textColor="#ff7aff24"
      android:textSize="35dp" />
      
   <ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageView"
      android:src="@drawable/abc"
      android:layout_below="@+id/textView"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="camera"
      android:id="@+id/button"
      android:layout_below="@+id/imageView"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="86dp" />
      
</RelativeLayout>

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

 

<resources>
   <string name="app_name">My Application</string>
   <string name="hello_world">Hello world!</string>
   <string name="action_settings">Settings</string>
</resources>

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

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.camera"
   android:versionCode="1"
   android:versionName="1.0" >

   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name="com.example.sairamkrishna.myapplication.MainActivity"
         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>

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

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

 

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

 

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

استفاده مستقیم از دوربین 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 را اجرا کنید. دو گروهی که استفاده می شوند دارای اهداف زیر می باشند.

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 نیاز دارید، زیرا شبیه ساز , دوربین را پشتیبانی نمی کند.

  • برای ایجاد یک برنامه ی اندروید از 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 را همانطور که در زیر نمایش داده شده، تغییر دهید تا دستورات لازم برای دوربین را اضافه کنید.

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

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

 

package com.example.sairamkrishna.myapplication;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;

import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;

import android.graphics.Bitmap;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;

import android.os.BatteryManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import java.util.ArrayList;
import java.util.Set;

public class MainActivity extends Activity implements SurfaceHolder.Callback {
   Camera camera;
   SurfaceView surfaceView;
   SurfaceHolder surfaceHolder;
   
   Camera.PictureCallback rawCallback;
   Camera.ShutterCallback shutterCallback;
   Camera.PictureCallback jpegCallback;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
      surfaceHolder = surfaceView.getHolder();
      
      surfaceHolder.addCallback(this);
      surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      
      jpegCallback = new PictureCallback() {
         
         @Override
         public void onPictureTaken(byte[] data, Camera camera) {
            FileOutputStream outStream = null;
               try {
                  outStream = new FileOutputStream(String.format("/sdcard/%d.jpg", System.currentTimeMillis()));
                  
                  outStream.write(data);
                  outStream.close();
               }
               
               catch (FileNotFoundException e) {
                  e.printStackTrace();
               }
               
               catch (IOException e) {
                  e.printStackTrace();
               }
               
               finally {
               }
               
               Toast.makeText(getApplicationContext(), "Picture Saved", Toast.LENGTH_LONG).show();
               refreshCamera();
            }
         };
      }
      
      public void captureImage(View v) throws IOException {
         camera.takePicture(null, null, jpegCallback);
      }
      
      public void refreshCamera() {
         if (surfaceHolder.getSurface() == null) {
            return;
         }
         
         try {
            camera.stopPreview();
         }
         
         catch (Exception e) {
         }
         
         try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
         }
         catch (Exception e) {
      }
   }
   
   @Override
   protected void onDestroy() {
      super.onDestroy();
   }
   
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.menu_main, menu);
      return true;
   }
   
   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      // Handle action bar item clicks here. The action bar
      // automatically handle clicks on the Home/Up button, so long
      // as you specify a parent activity in AndroidManifest.xml.
      
      int id = item.getItemId();
      
      //noinspection SimplifiableIfStatement
      if (id == R.id.action_settings) {
         return true;
      }
      return super.onOptionsItemSelected(item);
   }
   
   @Override
   public void surfaceCreated(SurfaceHolder holder) {
      try {
         camera = Camera.open();
      }
      
      catch (RuntimeException e) {
         System.err.println(e);
         return;
      }
      
      Camera.Parameters param;
      param = camera.getParameters();
      param.setPreviewSize(352, 288);
      camera.setParameters(param);
      
      try {
         camera.setPreviewDisplay(surfaceHolder);
         camera.startPreview();
      }
      
      catch (Exception e) {
         System.err.println(e);
         return;
      }
   }
   
   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
      refreshCamera();
   }
   
   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
      camera.stopPreview();
      camera.release();
      camera = null;
   }
}

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

 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
   android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
   
   <TextView android:text="Camera Example" android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/textview"
      android:textSize="35dp"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point"
      android:id="@+id/textView"
      android:layout_below="@+id/textview"
      android:layout_centerHorizontal="true"
      android:textColor="#ff7aff24"
      android:textSize="35dp" />
      
   <SurfaceView
      android:id="@+id/surfaceView"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"/>
      
</RelativeLayout>

محتوای res/values/string.xmlتغییر دهید.

 

<resources>
   <string name="app_name">My Application</string>
   <string name="hello_world">Hello world!</string>
   <string name="action_settings">Settings</string>
</resources>

محتوای AndroidManifest.xmlرا به صورت زیر تغییر دهید.


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.camera1"
   android:versionCode="1"
   android:versionName="1.0" >
   
   <uses-permission android:name="android.permission.CAMERA" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
   <uses-feature android:name="android.hardware.camera" />
   <uses-feature android:name="android.hardware.camera.autofocus" />

   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name="com.example.sairamkrishna.myapplication.MainActivity"
         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>

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

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

 

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

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه