android camera 根据加速器的变化实现自动对焦
实现的效果是当加速器的变化在设定范围外时,相机会自动对焦。
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 根据加速器的变化实现自动对焦相关推荐
- Android Camera 编程从入门到精通
一.前言 想通过一篇文章就让我们精通 Android 的 Camera 那肯定是不可能的事情.但通过对 Android 中相机拍照的所有的方式的梳理和理解,包括直接调起相机拍照,Camera API ...
- Android Camera基本用法一
1 Camera 简介 讲解编解码之前先对Camera进行简单的介绍,本篇介绍完之后只能保证小白会用Camera预览画面,其他的Camera知识会后续讲解. 考虑兼容性依然介绍Camera,目录为an ...
- Android Camera了解一下
首发于公众号 Android Camera了解一下 Camera 演进简介 最近在项目中遇到 Camera相关的场景,之前对这块不是很了解,趁机补了一下盲区.Android Camera 相关也是生态 ...
- android Camera 拍照的两个问题
2010.11.16---android Camera 拍照的两个问题 1.setParameters failed 异常信息如下 Java代码 11-16 11:21:33.902: WARN/ ...
- Android 5.0 API 的变化——开发人员注意
Android 5.0 API变化 译自 http://developer.android.com/intl/zh-cn/about/versions/android-5.0.html -- By N ...
- Android camera(4)---Android Camera开发之基础知识篇
Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...
- android camera (2) ---高通平台camera开发
1. 设置摄像头方向 2. 打开线程与预览线程 3. 设置参数 4. Camera外设按键 5. 自动对焦与触摸对焦 6. 拍照 7. 人脸检测 8. 位置管理 9. 旋转管理 10. 变焦 11. ...
- Android Camera TakePicture過程分析
Android Camera TakePicture過程分析 接著上一篇文章,繼續講解camera拍照等具體功能實行流程 Camera子系统采用C/S架构,客户端和服务端在两个不同的进程当中,它们使用 ...
- Android Camera数据流分析全程记录(overlay方式一)
Android Camera数据流分析全程记录(overlay方式) 这里为什么要研究overlay方式呢?android camera需要driver和app层需要有大量数据需要传输,如果使用非o ...
最新文章
- 刚刚!2020世界大学学术排名正式发布:中国内地144所大学上榜!
- CCNP学习笔记(6)
- 计算机类东北大学和大连理工,东北大学VS大连理工大学,谁才是第一,辽宁本地考生也两难...
- 非科班通过几个月的培训入行人工智能现实吗?
- laravel项目运行 php artisan cache:clear 命令报错
- ActionBarActionMode的理解,出现菜单栏
- Ajax设置自定义请求头的两种方法
- 飞行模式的开启和关闭
- Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法
- json.js+ jquery 操作笔记
- java跨系统和跨域_java web服务解决跨域问题
- TCP/IP参考模型
- 编写函数实现随机产生指定范围的整数的功能
- linux git文件图标,Linux下使用git管理项目
- Other - 个人对知识讨论、分享等平台上抄袭乱象的看法
- 模拟登陆qq空间实现(3)
- 软件开发的需求文档如何去写
- 问题:VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path
- android设置输入数字英文,android 安卓editext默认弹出英文输入法,只能输入英文与数字(示例代码)...
- 成功人士分析问题的11种思维方式