آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

استفاده از دوربین + (اموزش) سورس قرار گرفت 

android  9 سال پیش  8 سال پیش
+29 0

سلام دوستان من میخوام یه اموزش از چگونگی استفاده از دوربین های عقب و جلو رو بدون استفاده از کتابخونه بدم.

اول از همه یه فایل جاوا درست می کنید بعد اسمش رو تغیر میدید به 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;
		}
	}
}

دوستان ادامه قرار گرفت...

 

موفق باشی

 

 

 

0 0
امشب ادامه قرار میگیره....... (9 سال پیش)
0 0
دوستان اگر در جایی اشتباه گفتم بگید باتشکر (9 سال پیش)
0 0
ر (9 سال پیش)
0 0
دوستان این سوال من رو ببینین با تشکر لینک (9 سال پیش)
 برای این سوال 6 پاسخ وجود دارد.
پاسخ به سوال 
android  9 سال پیش
+5 0

با سلامی دوباره با بقیه اموزش ها در خدمت شما هستیم.

حالا ما برای این که بخوایم یه طراحی برای برنامه انجام بدیم باید اول یک  لایه ای درست کنیم و اسمش رو بزاریم 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" />

 

دوستان قرار گرفت

 

با تشکر از نظرات شما

 

0 0
دوستان بقیه اموزش ها بعد از ظهر قرار میگیرد.. (9 سال پیش)
0 0
. (9 سال پیش)
پاسخ به سوال 
android  9 سال پیش
+3 0

سلام با قسمت اخر اموزش در خدمت شما هستیم.

خوب حالا ما یه کلاس جاوا میسازیم و اسمش رو تغیر میدم به 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) {
	}
}

 

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

و دوستان اگر بشه به این سوال من هم جواب بدین خوب میشه لینک در پایین قرار گرفته

باتشکر از شما

 

0 0
لینک اینم لینکش (9 سال پیش)
پاسخ به سوال 
parand  8 سال پیش
+1 0

با سلام

قسمت CameraInfo

Camera.getNumberOfCameras();

Camera.open

هر سه این قسمت خطای CameraInfo cannot be resolved to a type را بر میگرداند

آیا نیاز به اضافه کردن jar فایل خاصی نیست؟؟؟

پاسخ به سوال 
android  8 سال پیش
+1 0

سلام دوستان عزیز هیچ گونه مشکلی در کد ها نیست همین حالا تست کردم نه نیازی به کتابخونه داره و نه نیازی به فایل های jar با عرض معذرت از مدیران سایت به علت این که قسمت نظرات بسته بود در پاسخ جواب دادم...

پاسخ به سوال 
مهدی   8 سال پیش
0 0

با سلام و تشکر;

من از کد شما استفاده کردم و با این خطا مواجه شدم، مطمئنم کد شما درست هست و تنظیمات اکلیپس ایراد داره یا نیاز به لایبری هست، لطفا راهنمایی کنید.

 

+1 0
دقت کنید که دوتا camera وجود داره یکی برای گرافیک هست و یکی هم مربوط به سخت افزار دوربین گوشی میشه که طبق راهنمایی که خود اکلیپس به شما کرده باید hardware.camera رو import کنید (8 سال پیش)
+1 0
بله hardware رو import کردم. (8 سال پیش)
پاسخ به سوال 
android  8 سال پیش
+1 0

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

سورس کد

با تشکر از شما 

+1 0
ممنون بابت آموزشتون . خیلی مفید بود (8 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .