android focus mode,Android Camera Focus Mode

I was trying to implement focus functionality in my app and achieved this functionality in the way i wanted. To implement Touch to Focus please refer the code below.

CameraPreview.java

public class CameraPreview extends SurfaceView implements

SurfaceHolder.Callback {

private SurfaceHolder mSurfaceHolder;

private Camera mCamera;

private OnFocusListener onFocusListener;

private boolean needToTakePic = false;

private Camera.AutoFocusCallback myAutoFocusCallback = new Camera.AutoFocusCallback() {

@Override

public void onAutoFocus(boolean arg0, Camera arg1) {

if (arg0) {

mCamera.cancelAutoFocus();

}

}

};

// Constructor that obtains context and camera

@SuppressWarnings("deprecation")

public CameraPreview(Context context, Camera camera) {

super(context);

this.mCamera = camera;

this.mSurfaceHolder = this.getHolder();

this.mSurfaceHolder.addCallback(this);

this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

this.onFocusListener = (OnFocusListener) context;

}

@Override

public void surfaceCreated(SurfaceHolder surfaceHolder) {

try {

mCamera.setPreviewDisplay(surfaceHolder);

mCamera.getParameters().setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

mCamera.setDisplayOrientation(90);

mCamera.startPreview();

} catch (IOException e) {

// left blank for now

e.printStackTrace();

}

}

@Override

public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

mCamera.stopPreview();

this.mSurfaceHolder.removeCallback(this);

mCamera.release();

}

@Override

public void surfaceChanged(SurfaceHolder surfaceHolder, int format,

int width, int height) {

// start preview with new settings

try {

mCamera.setPreviewDisplay(surfaceHolder);

mCamera.startPreview();

} catch (Exception e) {

// intentionally left blank for a test

e.printStackTrace();

}

}

/**

* Called from PreviewSurfaceView to set touch focus.

*

* @param - Rect - new area for auto focus

*/

public void doTouchFocus(final Rect tfocusRect) {

try {

List focusList = new ArrayList();

Camera.Area focusArea = new Camera.Area(tfocusRect, 1000);

focusList.add(focusArea);

Camera.Parameters param = mCamera.getParameters();

param.setFocusAreas(focusList);

param.setMeteringAreas(focusList);

mCamera.setParameters(param);

mCamera.autoFocus(myAutoFocusCallback);

} catch (Exception e) {

e.printStackTrace();

}

if (isNeedToTakePic()) {

onFocusListener.onFocused();

}

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

float x = event.getX();

float y = event.getY();

Rect touchRect = new Rect(

(int) (x - 100),

(int) (y - 100),

(int) (x + 100),

(int) (y + 100));

final Rect targetFocusRect = new Rect(

touchRect.left * 2000 / this.getWidth() - 1000,

touchRect.top * 2000 / this.getHeight() - 1000,

touchRect.right * 2000 / this.getWidth() - 1000,

touchRect.bottom * 2000 / this.getHeight() - 1000);

doTouchFocus(targetFocusRect);

}

return false;

}

public boolean isNeedToTakePic() {

return needToTakePic;

}

public void setNeedToTakePic(boolean needToTakePic) {

this.needToTakePic = needToTakePic;

}

}

MainActivity.java

public class MainActivity extends Activity

implements OnFocusListener {

private Button captureButton, switchCameraButton;

private Camera mCamera;

private CameraPreview mCameraPreview;

private int currentCameraId;

/**

* Called when the activity is first created.

*/

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

if (getIntent().hasExtra("camera_id")) {

currentCameraId = getIntent().getIntExtra("camera_id", Camera.CameraInfo.CAMERA_FACING_BACK);

} else {

currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;

}

captureButton = (Button) findViewById(R.id.button_capture);

captureButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(final View v) {

// Obtain MotionEvent object

v.setEnabled(false);

mCameraPreview.setNeedToTakePic(true);

long downTime = SystemClock.uptimeMillis();

long eventTime = SystemClock.uptimeMillis() + 100;

float x = mCameraPreview.getWidth() / 2;

float y = mCameraPreview.getHeight() / 2;

// List of meta states found here: developer.android.com/reference/android/view/KeyEvent.html#getMetaState()

int metaState = 0;

MotionEvent motionEvent = MotionEvent.obtain(

downTime,

eventTime,

MotionEvent.ACTION_DOWN,

x,

y,

metaState

);

// Dispatch touch event to view

mCameraPreview.dispatchTouchEvent(motionEvent);

}

});

switchCameraButton = (Button) findViewById(R.id.button_switch_camera);

switchCameraButton.setVisibility(

Camera.getNumberOfCameras() > 1 ? View.VISIBLE : View.GONE);

switchCameraButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mCamera.stopPreview();

//NB: if you don't release the current camera before switching, you app will crash

mCameraPreview.getHolder().removeCallback(mCameraPreview);

mCamera.release();

//swap the id of the camera to be used

if (currentCameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {

currentCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;

} else {

currentCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;

}

mCamera = getCameraInstance(currentCameraId);

mCameraPreview = new CameraPreview(MainActivity.this, mCamera);

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

preview.removeAllViews();

preview.addView(mCameraPreview);

}

});

}

@Override

protected void onResume() {

super.onResume();

mCamera = getCameraInstance(currentCameraId);

mCameraPreview = new CameraPreview(this, mCamera);

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

preview.addView(mCameraPreview);

}

/**

* Helper method to access the camera returns null if it cannot get the

* camera or does not exist

*

* @return

*/

private Camera getCameraInstance(int currentCameraId) {

Camera camera = null;

try {

camera = Camera.open(currentCameraId);

} catch (Exception e) {

// cannot get camera or does not exist

}

return camera;

}

Camera.PictureCallback mPicture = new Camera.PictureCallback() {

@Override

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

File pictureFile = getOutputMediaFile();

if (pictureFile == null) {

return;

}

try {

FileOutputStream fos = new FileOutputStream(pictureFile);

fos.write(data);

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

};

private static File getOutputMediaFile() {

File mediaStorageDir = new File(

Environment

.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),

"MyCameraApp");

if (!mediaStorageDir.exists()) {

if (!mediaStorageDir.mkdirs()) {

Log.d("MyCameraApp", "failed to create directory");

return null;

}

}

// Create a media file name

// String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")

// .format(new Date());

File mediaFile;

mediaFile = new File(mediaStorageDir.getPath() + File.separator

+ "IMG_" + "DEMO_" + ".jpg");

if (mediaFile.exists()) mediaFile.delete();

return mediaFile;

}

@Override

public void onFocused() {

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

mCamera.takePicture(null, null, mPicture);

mCameraPreview.setNeedToTakePic(false);

captureButton.setEnabled(true);

}

}, 1500);

}

}

activity_main.xml

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical">

android:id="@+id/camera_preview"

android:layout_width="fill_parent"

android:layout_height="0dp"

android:layout_weight="1" />

android:id="@+id/button_switch_camera"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:text="Switch Camera" />

android:id="@+id/button_capture"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:text="Capture" />

You can find sample app on Github - Custom Camera App

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值