先说说我的测试机器:nexus s。以下的结果都是通过nexus s上测试通过。
还是先上代码:
package com.TestCamera1;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.PreviewCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.SurfaceHolder.Callback;
import android.view.View.OnClickListener;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
public class TestCamera1Activity extends Activity {
/** Called when the activity is first created. */
private SurfaceHolder surfaceHolder;
private Camera camera;
private int cameraId;
private SurfaceView surfaceView;
private Button btn;
private boolean flag;
private Camera.PreviewCallback previewCallBack;
private AutoFocusCallback cb = new AutoFocusCallback() {//自动对焦实现
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
camera.setOneShotPreviewCallback(pcb);
} else {
Log.i("autofocus:", "fail");
}
}
};
private PreviewCallback pcb=new PreviewCallback(){
public void onPreviewFrame(byte[] data,Camera arg1){
if(data!=null){
String picDirStr = Environment.getExternalStorageDirectory()
+ "/";
File picDir = new File(picDirStr);
if (!picDir.exists()) {
picDir.mkdir();
}
String picName = picDirStr + System.currentTimeMillis()
+ "auto.jpg";
File myCaptureFile = new File(picName);
Camera.Parameters parameters=camera.getParameters();
int imageFormat=parameters.getPreviewFormat();
if(imageFormat==ImageFormat.NV21){
Bitmap image=null;
int w=parameters.getPreviewSize().width;
int h=parameters.getPreviewSize().height;
Rect rect=new Rect(0,0,w,h);
YuvImage img=new YuvImage(data,ImageFormat.NV21,w,h,null);
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
img.compressToJpeg(rect, 100, bos);
bos.flush();
bos.close();
camera.startPreview();// 重新打开预览图,进行下一次的拍照准备,必须等到onPictureCallback函数调用才能调用
Log.i("autopic", "ok!");
} catch (Exception e) {
Log.i("autopic", e.toString());
}
}
}else{
Log.i("data:", "null");
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
btn = (Button) findViewById(R.id.button1);
surfaceView = (SurfaceView) findViewById(R.id.preview_view);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().addCallback(new SurfaceViewCallback());
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
camera.autoFocus(cb);// 自动对焦
}
});
}
private final class SurfaceViewCallback implements SurfaceHolder.Callback {
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
Camera.Parameters parameters = camera.getParameters();
// 选择合适的预览尺寸
List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
Camera.Size cameraSize = (Camera.Size) sizeList.get(1);
parameters.setPreviewSize(cameraSize.width, cameraSize.height);
parameters.setPreviewFrameRate(5);
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.set("jpeg-quality", 100);
int rotation = TestCamera1Activity.this.getWindowManager()
.getDefaultDisplay().getRotation();
Log.e("default", rotation + "");
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
camera.setDisplayOrientation(90);
flag = true;
Log.i("por", "1");
}
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
parameters.set("orientation", "landscape");
parameters.set("rotation", 0);
flag = false;
Log.i("orientation", "1");
}
camera.setParameters(parameters);
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
System.out.println(e.getMessage());
}
camera.startPreview();
}
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
camera = Camera.open();
}
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
if (camera != null) {
camera.stopPreview();
}
camera.release();
camera = null;
}
}
}
自动对焦比较简单,只需要调用camera.autoFocus(cb)。然后调用自动对焦的回调函数private AutoFocusCallback cb = new AutoFocusCallback()
{},当然你也可以不构造这个函数即是camera.autoFocus(null),前提是你保证你的手机支持自动对焦。然后就是照相了,可以调用camera.setOneShotPreviewCallback或者camera.setPreviewCallback,他们的区别就是前者记录对焦时候预览图的一帧,而后者就不停地调用,即你可以得到很多对焦过程中得到的预览图。
需要注意的是预览图的格式是NV21,而BitmapFactory不支持这种格式的解码。所以需要转换。
如果你想不断的对照就需要一个Timer不断出发autoFocus函数了。
最后我想说说takepicture和preview。他们都可以照相,那么他们有什么区别呢?所谓的照相我觉得就是得到data,把这个data输出成照片就完成照相功能了,那么他们都能完成这个功能,所以在这点上他们没有太大差别。只是preview可以得到一幅对焦后的图片,比takepicture清晰。你当然可以autofocus之后再takepicture,那么得到的图片就跟preview一样了。
附上android camera(3)的demo:android camera.rar
下集说的是利用zxing对条形码和二维码进行解码,其实这个是我的原本目的。因为zxing解码需要照相机我才去恶补一下camera的知识。
忘了警告:android camera系列的文章是由一个刚接触android不到一个月的菜鸟所写,所以必然存在很多错误,请大家指出
分享到:
相关推荐
自己总结的Android Camera系统架构及源码分析,以framework和hal为主。
分享Android测试程序,使用Graphics.Camera进行3d旋转。
因为工作中要使用 Android Camera2 API 来实现相机功能,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,这个项目就是我研究的成果。 其中包括一个自己写的Camera2的Demo...
Android Camera2 API
由于工作中需要用到Camera1,所以花了两天时间研究了以下,使用Android Camera1 API实现了相机预览、拍照和录制视频的功能。 资源中有个MyCamera1Demo.apk可以直接安装运行,MyCamera1Demo.zip是Demo源码。 具体详见...
我自己写的Android CameraX Demo,实现了预览/拍照/录制视频/图片分析/对焦/切换摄像头等操作。 具体详见我的博客 : https://blog.csdn.net/EthanCo/article/details/125603671
Android 5.0以上Google官方建议使用camera2 ,camera已废弃。在这里给大家下载官方demo.
android camera mirror 前置后置相机视频预览时左右镜像,实现镜子效果 基于以下网址实现的android studio项目源代码包,可以直接打开使用 https://blog.csdn.net/mbrose/article/details/80167781 代码做了一...
androidcamera摄像头驱动.pdf
(精品)Android Camera分析(整理).pdf Android 的Camera架构介绍.pdf Camera模块解析驱动.pdf Android Camera的接口与架构介绍.pdf 第七章_Android_Camera架构.pdf 学习camera framework 总结.pdf Android框架下...
Android Camera Imaging Test Suite / CTS Verifier Document version: 1.9 Document date: 31st May, 2016 The ITS is a framework for running tests on the images produced by an Android camera.
Android camera整体框架介绍
Android原生人脸识别,包含Camera和Camera2两种实现方法
Android Camera添加水印,编码的时候增加水印,任何APP拍照或录像有水印
camera3.h
一个简单的android camera的实现
android camera demo; 在android 6.0,7.0上,就是有时会出现没有预览的情况。一般都是因为Camera已经打开,而View 还没有初始化完成。在楼主的Demo上,只需要把开启Camera的代码放到CameraTextureView中的...
android原生人脸识别demo camera2
androidusbcamera是在saki4510t/uvc camera的基础上开发的,usb摄像机(uvc设备)项目和视频数据采集的使用都是高度封装的,它可以通过几个简单的api帮助开发者轻松使用usb摄像机设备。通过使用androidusbcamera,您...