今天整了一个android的开启相机的东西,整了一天代码,网上看了很久,也算是搞出来了,泪奔~~ :cry:
首先创建一个android项目,然后设置[b]屏幕全屏,去标题栏[/b]等等.
Window window = getWindow();
// 去除标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 设置全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置高亮
// window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// 设置窗口半透明
// getWindow().setFormat(PixelFormat.TRANSLUCENT);
我这里没用用系统提供的布局main.xml,而是自己做一个布局,FrameLayout f1 = new FrameLayout(this);之后设置触摸监听用来拍照。
f1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ca.autoFocus(myAutoFocusCallback);
ca.takePicture(null,null, pictureCallback);
return false;
}
});
setContentView(f1);主类把这个设置为主试图
接下来写相机类,这里主要用到Camera,Bitmap用来存储拍照数据,保存到sd卡中
public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.i("yao", "onpictureTaken");
Toast.makeText(getApplicationContext(), "正在保存...",
Toast.LENGTH_SHORT).show();
// 用BitmapFactory.decodeByteArray()方法可以把相机传回的裸数据转换成Bitmap对象
mb = BitmapFactory.decodeByteArray(data, 0, data.length);

System.out.println("正在保存小片中");
// 接下来的工作就是把Bitmap保存成一个存储卡中的文件
//文件名中不能有“:”
File file = new File("/sdcard/Android/data/"
+ new DateFormat().format("yyyy-MM-dd_hh-mm-ss",
Calendar.getInstance(Locale.CHINA)) + ".jpg");

try {
file.createNewFile();
System.out.println("创建完毕");
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));
mb.compress(Bitmap.CompressFormat.PNG,100, bos);
System.out.println("搞定");
bos.flush();
bos.close();
Toast.makeText(getApplicationContext(), "图片保存完毕,在data/my_phone/目录中",
Toast.LENGTH_LONG).show();
//重新启动照相机
ca.stopPreview();
ca.startPreview();
//cav = new CameraView(MainActivity.this);
} catch (Exception e) {
e.printStackTrace();
}
}
相机视图类用来捕捉屏幕,并即时反馈,这就可以实现照相
// 照相视图
class CameraView extends SurfaceView {
private SurfaceHolder holder = null;

// 构造函数
public CameraView(Context context) {
super(context);
Log.i("yao", "CameraView");
// 操作surface的holder
holder = this.getHolder();
// 创建SurfaceHolder.Callback对象
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 停止预览
ca.stopPreview();
System.out.println("停止阅览了 释放资源,并滞空!");
// 释放相机资源并置空
ca.release();
ca = null;
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
// 当预览视图创建的时候开启相机
ca = Camera.open();
try {
// 设置预览
ca.setPreviewDisplay(holder);
} catch (IOException e) {
// 释放相机资源并置空
ca.release();
ca = null;
}
}

// 当surface视图数据发生变化时,处理预览信息
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
setCameraDisplayOrientation(MainActivity.this, 0, ca);
// 获得相机参数对象
Camera.Parameters parameters = ca.getParameters();
// 设置格式
// parameters.setPictureFormat(PixelFormat.JPEG);
// 设置预览大小,这里我的测试机是Milsstone所以设置的是854x480
// parameters.setPreviewSize(854, 480);
// 设置自动对焦
// parameters.setFocusMode("auto");
// 设置图片保存时的分辨率大小
parameters.setPictureSize(1296, 2304);
parameters.set("rotation", 90);
// 给相机对象设置刚才设定的参数
ca.setParameters(parameters);
// 开始预览
ca.startPreview();

}

});
// 设置Push缓冲类型,说明surface数据由其他来源提供,而不是用自己的Canvas来绘图,在这里是由摄像头来提供数据
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
}
parameters这里的参数我们需要按照自己手机的规格来设定,否则,在ca.setParameters(parameters);时会报错,我不太了解我的手机的规格,干脆没有更改,只改了相片的大小,这些都没关系。
刚开始的时候我的屏幕是左右颠倒的,这个我弄了好久也不知道原因,然后用了网上一段代码才搞定,原理大概是前后置摄像头有所不同,还有一个成像原理,总之调整数据就对了。
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}

int result;
//检查前置摄像头方法
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
现在这个app已经可以开始照相了,相片放在sdcard/Android/data中,大家可以自己更改路径。ok,源码上传了,可能很乱。