1、利用硬件传感器去实现自动对焦

注册传感器:

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);

sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);

传感器接口:

implements SensorEventListener

实现传感器接口方法:

public void onSensorChanged(SensorEvent event) {

float x = event.values[0];

float y = event.values[1];

float z = event.values[2];

if (initFirstSensor) {//初始化默认进入时候的坐标

mLastX = x;

mLastY = y;

mLastZ = z;

initFirstSensor = false;

return;

}

float deltaX = Math.abs(mLastX - x);

float deltaY = Math.abs(mLastY - y);

float deltaZ = Math.abs(mLastZ - z);

if (deltaX > 2.5 || deltaY > 2.5 || deltaZ > 2.5) {//计算坐标偏移值

if (!isPhoto && mCamera != null) {

playFocusAnimal(focusX, focusY);//播放对焦动画

// mCamera.autoFocus(autoFocusCallback);//调用相机对焦

}

}

mLastX = x;

mLastY = y;

mLastZ = z;

}

2、单点触摸对焦

监听touch事件拿到event:

public boolean onTouch(View v, MotionEvent event) {

if (!isPhoto && mCamera != null) {

playFocusAnimal((int) event.getX(), (int) event.getY());

touchFocus(event);

}

return false;

}

根据触摸位置设置对焦点的对焦权值:

(解释一下:每个对焦区域是一个具有特定权值的长方形。方向与重力感应的方向有关。而且不会受到setDisplayOrientation(int)旋转画面设置的影响。矩形的坐标范围指定从-1000到1000 ,(-1000,-1000)是左上角点(1000,1000)是右下角点。对焦权值的取值范围是1-1000,权值为矩形范围像素所平分,这意味着同样的权值对焦区域大的对整体的对焦影响小。

理论结合实际的说就是,假如你的整个屏幕的宽度是width,那么点击某个位置算x,那么要划定对焦区域,就要告诉相机对焦的坐标,根据对焦坐标的范围为-1000到1000,所以要用公式计算对应的对焦坐标实际上是: x/width*2000-1000=对焦x坐标,同样获取到对焦y坐标,然后以x,y为中心,指定对焦区域,设置对焦权值,越大表示优先对焦该位置)

代码:

private void touchFocus(MotionEvent event) {

mCamera.cancelAutoFocus();

Camera.Parameters p = mCamera.getParameters();

float touchX = (event.getRawX() / screenWidth) * 2000 - 1000;

float touchY = (event.getRawY() / screenHeight) * 2000 - 1000;

int left = clamp((int) touchX - AREA_SIZE / 2, -1000, 1000);

int right = clamp(left + AREA_SIZE, -1000, 1000);

int top = clamp((int) touchY - AREA_SIZE / 2, -1000, 1000);

int bottom = clamp(top + AREA_SIZE, -1000, 1000);

Rect rect = new Rect(left, top, right, bottom);

if (p.getMaxNumFocusAreas() > 0) {

List areaList = new ArrayList();

areaList.add(new Camera.Area(rect, 1000));

p.setFocusAreas(areaList);

}

if (p.getMaxNumMeteringAreas() > 0) {

List areaList = new ArrayList();

areaList.add(new Camera.Area(rect, 1000));

p.setMeteringAreas(areaList);

}

p.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

try {

mCamera.setParameters(p);

} catch (Exception e) {

}

mCamera.autoFocus(autoFocusCallback);

}

private int clamp(int x, int min, int max) {//保证坐标必须在min到max之内,否则异常

if (x > max) {

return max;

}

if (x < min) {

return min;

}

return x;

}

3、小米的坑

miui上的时候如果设置预览分辨率过高,则会导致拍照时候小米假死,无响应

解决方案:预览分辨率设置在屏幕分辨率左右,对miui特殊对待

private void initCameraParameters() {

Camera.Parameters parameters = mCamera.getParameters();

List vSizeList = parameters.getSupportedPictureSizes();

Camera.Size showSize = null;

Camera.Size tempSize;

Camera.Size miuiSize = null;

for (int num = 0; num < vSizeList.size(); num++) {

tempSize = vSizeList.get(num);

try {

parameters.setPreviewSize(tempSize.width, tempSize.height);

mCamera.setParameters(parameters);

if (showSize == null || (showSize != null && tempSize.width > showSize.width)) {

showSize = tempSize;//设置最高可以支持的屏幕分辨率

}

if (screenWidth < tempSize.width && (miuiSize == null || miuiSize.width > tempSize.width)) {

miuiSize = tempSize;//设置miui的预览大小在屏幕分辨率左右

}

} catch (Exception e) {

}

try {

parameters.setPictureSize(tempSize.width, tempSize.height);

mCamera.setParameters(parameters);

if (highSize == null || (highSize != null && tempSize.width > highSize.width)) {

highSize = tempSize;//设置相机可支持的最高保存分辨率

}

} catch (Exception e) {

}

if (screenWidth > tempSize.width && (nomalSize == null || nomalSize.width < tempSize.width)) {

nomalSize = tempSize;//设置一般相机保存的分辨率

}

}

if (showSize != null) {

if (android.os.Build.MANUFACTURER.equals("Xiaomi")) {//对待小米特殊设置

parameters.setPreviewSize(miuiSize.width, miuiSize.height);

} else {

parameters.setPreviewSize(showSize.width, showSize.height);

}

}

if (nomalSize != null) {

parameters.setPictureSize(nomalSize.width, nomalSize.height);

isNomal = true;

if (picQualityButton != null) {

picQualityButton.setImageDrawable(getResources().getDrawable(R.drawable.camera_pic_quality_nomal));

}

}

if (isSupportFlash) {

switch (currentFlashMode % 3) {

case 0:

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);

break;

case 1:

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);

break;

case 2:

parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);

break;

}

}

parameters.setPictureFormat(PixelFormat.JPEG);

parameters.setJpegQuality(100);

mCamera.setParameters(parameters);

mCamera.startPreview();

playFocusAnimal(screenWidth / 2, screenHeight / 2);

mCamera.autoFocus(autoFocusCallback);

}

author:iamwsbear@gmail.com

http://blog.csdn.net/iamws/article/details/50401886

android6.0相机假对焦,android相机对焦相关推荐

  1. android 相机拍照返回,Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题...

    版权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下调用系统相机拍照: 如果拍照后点击的是"确定"图标,返回的resultCode = -1(Activity.RESU ...

  2. android相机采集sdk,Android相机在Android SDK怪怪

    我使用相机首次,像大多数第一次的问题接踵而至......Android相机在Android SDK怪怪 我有我的活动肖像,但我的相机是面向非常怪异.它从字面上翻转了图像.因此,如果我从顶部粘住我的手指 ...

  3. android相机权限xml,Android相机权限检测兼容问题

    在做Android开发过程中,兼容问题一直都是安卓攻城狮们的常见的一个问题,各种手机品牌的兼容.还有API版本高低的兼容. 这里主要针对Android相机开发的兼容问题之 Fail to connec ...

  4. android触屏对焦,Android相机对焦模式

    I am trying to make a custom camera application I want to let the users can choose the focus mode in ...

  5. android6.0升级名单,三星Android 6.0升级详细名单[多图]

    三星机型的Android 6.0首批升级清单,去年的旗舰机Galaxy S5竟不在其中,使得消费者对手机第一大厂很失望. 今天,Sammobile更新了升级名单,并且列出了详细的型号以及定制版本对应的 ...

  6. android好用的相机软件推荐,Android相机软件对比--.

    布丁相机:布丁相机取景界面为横屏模式,在单手握持手机的情况下操作稍有不便.在界面左部分布有曝光补偿及拍摄模式选择按钮,右部则分别是闪光灯设置.触屏快门.设置.快门及相册,从布局上看也是更适合双手握持进 ...

  7. android6.0屏蔽home键,android 禁用home键

    android在4.4以后已经严格控制开发者对home键的操作权限,用户从应用级别禁止home键的可能性已经不大了.在4.4之前,可以通过 onAttachedToWindow 中设置 this.ge ...

  8. Android 相机教程,Android 相机教程

    Android相机教程 相机主要用于捕获图片和视频.我们可以通过使用相机API的方法来控制相机. Android通过以下两种方式提供了在相机上工作的功能: 通过相机意图 通过相机API 了解相机意图和 ...

  9. Android相机开发详解(一)

    Android相机开发详解(一) 请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的csdn博客) Android相机 ...

  10. Android6.0运行时权限解决方案

    今天在测试APP的时候发现部分手机APP定位权限使用不了.看了一下机型都是Android6.0以上版本的Android手机. 之前就听说Android6.0以上版本权限管理更严格了,没想到今天踩坑了. ...

最新文章

  1. Github上传大于100M文件:LFS
  2. Java中的简单浮点数类型float和double不能够进行精确运算
  3. 腾讯面试题 TCP/IP协议四个层次
  4. matlab图像相加例子,MATLAB图像处理例子
  5. 如何将HBuilder中的项目Push至Gitee中!
  6. 基于迁移深度学习的雷达信号分选识别
  7. DataBseDesign工作笔记001---基于RBAC用户权限管理数据库设计_用图的形式说明_精确到页面的元素
  8. 日销10万台的乐视商城如何颠覆传统电商
  9. linux rpm安装简要说明
  10. MySQL-快速入门(7)索引
  11. python十以内加减法_【小学】 生成10以内的加减法
  12. 人工智能导论——概念篇
  13. Abaqus CPU并行计算 加速计算信息汇总
  14. CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]
  15. 2:哆来A梦的时光穿梭机
  16. WooCommerce API Keys的生成和保存机制
  17. SSD固态硬盘优化方案,让新买的SSD速度不再慢
  18. Springboot注解@ServletComponentScan和@ComponentScan
  19. docker容器访问宿主机mysql数据库
  20. 对上海市麦当劳、KFC门店分布进行空间分析

热门文章

  1. R语言抽样并验证总体分别为正态分布、均匀分布、指数分布时样本均值的抽样分布
  2. JavaScript中常用的的字符串方法总结+详解
  3. 计算机或信息化的专业职称,信息系统项目管理师是高级职称吗?
  4. 如何创建自己的Cydia源
  5. QuickTime不支持播放HEVC编码mp4/mov视频
  6. 读书感受 之 《心理学入门》
  7. python打字_Python编写打字训练小程序
  8. 程序员因接外包坐牢!两万字长文揭露心酸真实经历
  9. Flask+ZUI 开发小型工具网站(二)——ZUI
  10. 女朋友问阿里双十一实时大屏如何实现,我惊呆一会,马上手把手教她背后的大数据技术