استفاده از دوربین + (اموزش) سورس قرار گرفت
سلام دوستان من میخوام یه اموزش از چگونگی استفاده از دوربین های عقب و جلو رو بدون استفاده از کتابخونه بدم.
اول از همه یه فایل جاوا درست می کنید بعد اسمش رو تغیر میدید به activity_main و این کد ها رو میریزید داخلش
که هر کدام توضیح داده شده است
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.CameraInfo; import android.hardware.Camera.PictureCallback; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; public class activity_main extends Activity { private Camera mCamera; private CameraPreview mPreview; private PictureCallback mPicture; private Button capture, switchCamera; private Context myContext; private LinearLayout cameraPreview; private boolean cameraFront = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); myContext = this; initialize(); } // دوستان این قسمت کد برای شناسایی دوربین جلو استفاده میشود که یه مقدار عددی دارد باید ان رو به دست اورد private int findFrontFacingCamera() { int cameraId = -1; int numberOfCameras = Camera.getNumberOfCameras(); for (int i = 0; i < numberOfCameras; i++) { CameraInfo info = new CameraInfo(); Camera.getCameraInfo(i, info); if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { cameraId = i; cameraFront = true; break; } } return cameraId; } // این کد هم مثل بالا که گفتم برای دوربین عقب گوشی استفاده می شود private int findBackFacingCamera() { int cameraId = -1; int numberOfCameras = Camera.getNumberOfCameras(); for (int i = 0; i < numberOfCameras; i++) { CameraInfo info = new CameraInfo(); Camera.getCameraInfo(i, info); if (info.facing == CameraInfo.CAMERA_FACING_BACK) { cameraId = i; cameraFront = false; break; } } return cameraId; } public void onResume() { super.onResume(); if (!hasCamera(myContext)) { Toast toast = Toast.makeText(myContext, "Sorry, your phone does not have a camera!", Toast.LENGTH_LONG); toast.show(); finish(); } // این شرت برا این هست که گفته اگر گوشی شما دوربین جلو نداشته باشد دکه رفتن به دوربین جلو رو غیر فعال کند if (mCamera == null) { if (findFrontFacingCamera() < 0) { Toast.makeText(this, "No front facing camera found.", Toast.LENGTH_LONG).show(); switchCamera.setVisibility(View.GONE); } // این قسمت کد هم برای این که دراجرای اولیه برنامه دوربین عقب اجرا شود mCamera = Camera.open(findBackFacingCamera()); mPicture = getPictureCallback(); mPreview.refreshCamera(mCamera); } } // این قسمت کد هم برای گرفتن مقادیر دوربین و نمایش انها در لایه مورد نظر public void initialize() { cameraPreview = (LinearLayout) findViewById(R.id.camera_preview); mPreview = new CameraPreview(myContext, mCamera); cameraPreview.addView(mPreview); capture = (Button) findViewById(R.id.button_capture); capture.setOnClickListener(captrureListener); switchCamera = (Button) findViewById(R.id.button_ChangeCamera); switchCamera.setOnClickListener(switchCameraListener); } // این قسمت برای رفتن به دوربین جلو استفاده میشود OnClickListener switchCameraListener = new OnClickListener() { @Override public void onClick(View v) { // این متغیر برای به دست اوردن تعداد دوربین ها استفادده میشود int camerasNumber = Camera.getNumberOfCameras(); // این شرط هم برای این هست که اگر تعداد دوربین های گوشی شما بیشتر از 1هست توابع استفاده شده در برنامه اجرا شوند if (camerasNumber > 1) { releaseCamera(); chooseCamera(); } else { Toast toast = Toast.makeText(myContext, "Sorry, your phone has only one camera!", Toast.LENGTH_LONG); toast.show(); } } }; // ا ین تابع برای اجرای دوربین ها استفاده میشود public void chooseCamera() { // باشد دوربین عقب فعال شود در غیر این صورت دوربین جلو false اگر مقدارش cameraFront این خط کد برای این است که if (cameraFront) { int cameraId = findBackFacingCamera(); if (cameraId >= 0) { mCamera = Camera.open(cameraId); mPicture = getPictureCallback(); mPreview.refreshCamera(mCamera); } } else { int cameraId = findFrontFacingCamera(); if (cameraId >= 0) { mCamera = Camera.open(cameraId); mPicture = getPictureCallback(); mPreview.refreshCamera(mCamera); } } } @Override protected void onPause() { super.onPause(); releaseCamera(); } private boolean hasCamera(Context context) { // برای این است که گوشی دارای دوربین هست یا نه if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { return true; } else { return false; } } //استفاده می شود PictureCallback ااین تابع برای دریافت تصاویر از حافظه وریختن ان در private PictureCallback getPictureCallback() { PictureCallback picture = new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // ایجاد یک فایل تصویری جدید File pictureFile = getOutputMediaFile(); if (pictureFile == null) { return; } try { //استفاده می شود byte این کد برای تبدیل کردن تصاویر به ارایه ای از FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); Toast toast = Toast.makeText(myContext, "Picture saved: " + pictureFile.getName(), Toast.LENGTH_LONG); toast.show(); } catch (FileNotFoundException e) { } catch (IOException e) { } // برای رفرش کردن دوربین استفاده میشود mPreview.refreshCamera(mCamera); } }; return picture; } OnClickListener captrureListener = new OnClickListener() { @Override public void onClick(View v) { // ین کد برای عکس گرفتن استفاده میشود mCamera.takePicture(null, null, mPicture); } }; // این تابع برای ذخیره سازی عکس در حافظه گوشی استفاده میشود private static File getOutputMediaFile() { // برای ایجاد یک فولدر در حافظه File mediaStorageDir = new File("/sdcard/", "JCG Camera"); //نباشد مقدار خالی باذگشت بده JCG Camera این شرط برای این هست که اگر فولدری به اسم if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { return null; } } // این استرینگ برای اسم عکس گرفته شده مورد استفاده میشود که در ان تاریخ و ساعت وثانیه و ماه در ان ذخیره میشود String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile; //استفاده میشود jpg برای ایجاد یک فایل باپسوند mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); return mediaFile; } private void releaseCamera() { if (mCamera != null) { mCamera.release(); mCamera = null; } } }
دوستان ادامه قرار گرفت...
موفق باشی
با سلامی دوباره با بقیه اموزش ها در خدمت شما هستیم.
حالا ما برای این که بخوایم یه طراحی برای برنامه انجام بدیم باید اول یک لایه ای درست کنیم و اسمش رو بزاریم activity_main.xml
و حالا این کد ها رو اضافش می کنیم.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <LinearLayout android:id="@+id/camera_preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:orientation="horizontal"/> <LinearLayout android:id="@+id/buttonsLayout" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center" android:orientation="vertical" > <Button android:id="@+id/button_ChangeCamera" android:layout_width="72dp" android:layout_height="wrap_content" android:text="دوربین جلو" android:layout_marginTop="30dp"/> <Button android:id="@+id/button_capture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="عکس گرفتن" android:layout_marginTop="100dp"/> </LinearLayout> </LinearLayout>
و حالا برای اجرای این برنامه لازم هست یه مجوز های به برنامه بدیم برای مجوز دادن این کد ها را درقسمت manifest برنامه وارد کرده.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.front" android:required="false" />
دوستان قرار گرفت
با تشکر از نظرات شما
سلام با قسمت اخر اموزش در خدمت شما هستیم.
خوب حالا ما یه کلاس جاوا میسازیم و اسمش رو تغیر میدم به CameraPreview و extends اش میکنیم به SurfaceView
دوستان SurfaceView بیشتر در بخش انیمیشن ها و render کردن مورد استفاده میشود.
و حالا این کد ها رو وارد کلاس CameraPreview میکنیم.
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
try {
if (mCamera == null) {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}
} catch (IOException e) {
Log.d(VIEW_LOG_TAG, "Error setting camera preview: " + e.getMessage());
}
}
public void refreshCamera(Camera camera) {
if (mHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
}
setCamera(camera);
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Log.d(VIEW_LOG_TAG, "Error starting camera preview: " + e.getMessage());
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
refreshCamera(mCamera);
}
public void setCamera(Camera camera) {
mCamera = camera;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
دوستان این اموزش هم به پایان رسید خواهشمند هستیم که اگر اشتباهی در ان وجود دار بگوید.
و دوستان اگر بشه به این سوال من هم جواب بدین خوب میشه لینک در پایین قرار گرفته
باتشکر از شما
با سلام
قسمت CameraInfo
Camera.getNumberOfCameras();
Camera.open
هر سه این قسمت خطای CameraInfo cannot be resolved to a type را بر میگرداند
آیا نیاز به اضافه کردن jar فایل خاصی نیست؟؟؟
سلام دوستان عزیز هیچ گونه مشکلی در کد ها نیست همین حالا تست کردم نه نیازی به کتابخونه داره و نه نیازی به فایل های jar با عرض معذرت از مدیران سایت به علت این که قسمت نظرات بسته بود در پاسخ جواب دادم...
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .