实现的效果是当加速器的变化在设定范围外时,相机会自动对焦。
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {private SurfaceView surfaceview;private SurfaceHolder surfaceholder;private Camera camera = null;private ImageView imageView;private Button startPre;private Button stopPre;private Button getPicture;private SensorManager sensorManager;private MyListener myListener;private Sensor mySensor;private float mLastX;private float mLastY;private float mLastZ;private boolean initBool = false;private boolean myAutoFocus = true;private Camera.AutoFocusCallback autoFocusCallback;private Camera.Parameters parameters;private WindowManager wm;private int screenWidth;private int screenHeight;/*    通过Camera方式来实现拍照通过Camera方式 会比通过Intent方式获得更为丰富的功能。通常创建一个定制化的Camera需要如下步骤:(1)    通过Camera.open()来获取Camera实例。(2)    创建Preview类,需要继承SurfaceView类并实现SurfaceHolder.Callback接口。(3)    为相机设置Preview(4)    构建一个Preview的Layout来 预览相机;(5)    为拍照建立Listener以获取拍照后的回调;(6)    拍照并保存文件;(7)    释放Camera。*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initSensor();initView();initEvent();}//初始化加速传感器private void initSensor() {sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);mySensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);myListener = new MyListener();List<Sensor> list = sensorManager.getSensorList(Sensor.TYPE_ALL);//全部传感器for(Sensor sensor:list){Log.i("----->",""+sensor.getName());}}private void initView() {surfaceview = (SurfaceView) findViewById(R.id.surfaceview);startPre = (Button) this.findViewById(R.id.beginPrievw);stopPre = (Button) this.findViewById(R.id.stopPrievw);getPicture = (Button) this.findViewById(R.id.getPicture);imageView = (ImageView) this.findViewById(R.id.imageView);}private void initEvent() {surfaceholder = surfaceview.getHolder();surfaceholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surfaceholder.addCallback(this);stopPre.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {camera.stopPreview();}});getPicture.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {camera.takePicture(null, null, pictureCallback);}});//初始化自动对焦回掉autoFocusCallback = new Camera.AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean b, Camera camera) {myAutoFocus = true;if (b) {camera.cancelAutoFocus();Log.i("=========>", "对焦成功!");} else {Log.i("=========>", "对焦失败!");}}};//获取屏幕的宽和高wm = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE);screenWidth = wm.getDefaultDisplay().getWidth();screenHeight = wm.getDefaultDisplay().getHeight();}@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {Log.i("------->", "surfaceCreated");System.out.println("surfacecreated");//获取camera对象if (camera == null) {camera = Camera.open();Log.i("------->", "Camera open");}try {//设置预览监听camera.setPreviewDisplay(surfaceHolder);parameters = camera.getParameters();List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
//            parameters.setPictureFormat(PixelFormat.JPEG);
//            parameters.setJpegQuality(CameraProfile.QUALITY_HIGH);Log.i("pictureFromat",""+parameters.getPictureFormat());parameters.setPictureSize(3840, 2160);//获得相机的对焦模式有哪些
//            List<String> focusModes = parameters.getSupportedFocusModes();
//            for (String mode:focusModes){
//             //   Log.i("==-------->",""+mode);
//            }parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//            List<String> focusModes = parameters.getSupportedFocusModes();
//          //得到摄像头支持的分辨率
//          if (sizeList.size() > 1){
//                Iterator<Camera.Size> itor = sizeList.iterator();
//                while(itor.hasNext()){
//                    Camera.Size cur = itor.next();
//                    Log.i("------->","width:"+cur.width+"  "+cur.height);
//                }
//            }//设置预览的方向if (this.getResources().getConfiguration().orientation!= Configuration.ORIENTATION_LANDSCAPE) {parameters.set("orientation", "portrait");camera.setDisplayOrientation(90);parameters.setRotation(90);} else {parameters.set("orientation", "landscape");camera.setDisplayOrientation(0);parameters.setRotation(0);}camera.setParameters(parameters);camera.startPreview();//camera.cancelAutoFocus();} catch (IOException e) {e.printStackTrace();camera.release();Log.e("---->","摄像头创建失败");}}@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {Log.i("------->", "surfaceChanged");myAutoFocus();}//对焦private void myAutoFocus() {try {camera.autoFocus(autoFocusCallback);} catch (Exception e) {Log.d("---->", "" + e.getMessage());}}@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceHolder) {Log.i("------->", "surfaceDestroyed");System.out.println("surfaceDestroyed");if (camera != null) {camera.stopPreview();camera.release();camera = null;}}/*  camera.takePicture(shutterCallback,rawcallback,pictureCallback);*/private Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback() {@Overridepublic void onShutter() {//按下快门瞬间的处理事件处}};private Camera.PictureCallback rawcallback = new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] bytes, Camera camera) {//处理raw代码}};private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] bytes, Camera camera) {File pictureFile = getOutputMediafile();if (pictureFile == null) {Log.e("--------->", "获取文件路径失败!");return;}try {FileOutputStream fos = new FileOutputStream(pictureFile);fos.write(bytes);fos.close();Log.i("--------->", "照片保存文件成功!");} catch (FileNotFoundException e) {Log.d("-------->", "row");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);imageView.setImageBitmap(bitmap);camera.startPreview();}};//加速传感器监听public class MyListener implements SensorEventListener{@Overridepublic void onSensorChanged(SensorEvent sensorEvent) {//values[0]:X轴,values[1]:Y轴,values[2]:Z轴float[] values = sensorEvent.values;float x = values[0];float y = values[1];float z = values[2];if (!initBool){mLastX = x;mLastY = y;mLastZ = z;initBool = !initBool;}float deltaX  = Math.abs(mLastX - x);float deltaY = Math.abs(mLastY - y);float deltaZ = Math.abs(mLastZ - z);if (deltaX > .5 && myAutoFocus){myAutoFocus = false;myAutoFocus();}if (deltaY > .5 && myAutoFocus){myAutoFocus = false;Log.i("---====---->","");myAutoFocus();}if (deltaZ > .5 && myAutoFocus){myAutoFocus = false;Log.i("---====---->","");myAutoFocus();}mLastX = x;mLastY = y;mLastZ = z;}@Overridepublic void onAccuracyChanged(Sensor sensor, int i) {//传感器精度变化时使用}}private File getOutputMediafile() {File picDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());String path = picDir.getPath() + File.separator + "IMAGE_" + timeStamp + ".jpg";Log.i("------------>", "文件保存路径是:" + path);return new File("/sdcard/Pictures/Test" + "IMAGE_" + timeStamp + ".jpg");}@Overrideprotected void onPause() {super.onPause();camera.stopPreview();//注销传感器监听事件,若不,后台仍继续运行sensorManager.unregisterListener(myListener);}@Overrideprotected void onResume() {super.onResume();camera.startPreview();//注册传感器监听事件boolean result = sensorManager.registerListener(myListener,mySensor,SensorManager.SENSOR_DELAY_NORMAL);Log.i("----->",""+result);}}
布局文件
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<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:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.myapplication.MainActivity"><SurfaceViewandroid:id="@+id/surfaceview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentTop="true"/><ImageViewandroid:id="@+id/imageView"android:layout_width="100dp"android:layout_height="100dp"android:layout_alignParentRight="true"android:layout_alignParentTop="true"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@+id/stopPrievw"android:layout_marginBottom="10dp"android:text="拍摄照片"android:id="@+id/getPicture"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="停止预览"android:layout_alignParentBottom="true"android:id="@+id/stopPrievw"/>
</RelativeLayout>

android camera 根据加速器的变化实现自动对焦相关推荐

  1. Android Camera 编程从入门到精通

    一.前言 想通过一篇文章就让我们精通 Android 的 Camera 那肯定是不可能的事情.但通过对 Android 中相机拍照的所有的方式的梳理和理解,包括直接调起相机拍照,Camera API ...

  2. Android Camera基本用法一

    1 Camera 简介 讲解编解码之前先对Camera进行简单的介绍,本篇介绍完之后只能保证小白会用Camera预览画面,其他的Camera知识会后续讲解. 考虑兼容性依然介绍Camera,目录为an ...

  3. Android Camera了解一下

    首发于公众号 Android Camera了解一下 Camera 演进简介 最近在项目中遇到 Camera相关的场景,之前对这块不是很了解,趁机补了一下盲区.Android Camera 相关也是生态 ...

  4. android Camera 拍照的两个问题

    2010.11.16---android Camera 拍照的两个问题 1.setParameters failed 异常信息如下 Java代码   11-16 11:21:33.902: WARN/ ...

  5. Android 5.0 API 的变化——开发人员注意

    Android 5.0 API变化 译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html -- By N ...

  6. Android camera(4)---Android Camera开发之基础知识篇

    Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...

  7. android camera (2) ---高通平台camera开发

    1. 设置摄像头方向 2. 打开线程与预览线程 3. 设置参数 4. Camera外设按键 5. 自动对焦与触摸对焦 6. 拍照 7. 人脸检测 8. 位置管理 9. 旋转管理 10. 变焦 11. ...

  8. Android Camera TakePicture過程分析

    Android Camera TakePicture過程分析 接著上一篇文章,繼續講解camera拍照等具體功能實行流程 Camera子系统采用C/S架构,客户端和服务端在两个不同的进程当中,它们使用 ...

  9. Android Camera数据流分析全程记录(overlay方式一)

     Android Camera数据流分析全程记录(overlay方式) 这里为什么要研究overlay方式呢?android camera需要driver和app层需要有大量数据需要传输,如果使用非o ...

最新文章

  1. 刚刚!2020世界大学学术排名正式发布:中国内地144所大学上榜!
  2. CCNP学习笔记(6)
  3. 计算机类东北大学和大连理工,东北大学VS大连理工大学,谁才是第一,辽宁本地考生也两难...
  4. 非科班通过几个月的培训入行人工智能现实吗?
  5. laravel项目运行 php artisan cache:clear 命令报错
  6. ActionBarActionMode的理解,出现菜单栏
  7. Ajax设置自定义请求头的两种方法
  8. 飞行模式的开启和关闭
  9. Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法
  10. json.js+ jquery 操作笔记
  11. java跨系统和跨域_java web服务解决跨域问题
  12. TCP/IP参考模型
  13. 编写函数实现随机产生指定范围的整数的功能
  14. linux git文件图标,Linux下使用git管理项目
  15. Other - 个人对知识讨论、分享等平台上抄袭乱象的看法
  16. 模拟登陆qq空间实现(3)
  17. 软件开发的需求文档如何去写
  18. 问题:VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path
  19. android设置输入数字英文,android 安卓editext默认弹出英文输入法,只能输入英文与数字(示例代码)...
  20. 成功人士分析问题的11种思维方式

热门文章

  1. boss直聘一句话介绍优势_BOSS直聘,综艺混战中的“技术流”
  2. WIFI的AP(Access Point)和STA(Station)指什么
  3. php批量爬取上市公司高管持股变动信息
  4. 大数据规划布局“未来生产要素”
  5. 天涯明月刀php文件,天涯明月刀OL显卡设置教程
  6. Python实现王者荣耀模拟抽水晶
  7. 2011年暖宝宝品牌推荐
  8. 上下确界 inf sup和最大小值 max min的区别
  9. SQL优化之火山模型、向量化、编译执行
  10. php 公众号队列推送,微信消息推送