利用camera实现照相机功能;
package com.example.camerdemo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Toast;
public class CameraDemo extends Activity implements Callback{
public static final int SAVA_SUCCESS = 0;
public static final int SAVA_FAILURE = 1;
private Camera mCamera;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private boolean isPreview;
private HandlerThread mHandlerThread;
private Handler savaHandler;
private Handler mainHandler = new Handler(){
public void handleMessage(android.os.Message msg) {
int w = msg.what;
switch (w) {
case SAVA_SUCCESS:
showToast("保存成功");
break;
case SAVA_FAILURE:
showToast("保存失败");
break;
}
mCamera.startPreview();
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main1);
mHandlerThread = new HandlerThread("saveHanlder");
mHandlerThread.start();
savaHandler = new Handler(mHandlerThread.getLooper());
if(!checkCamera()){
showToast("照相机不可用");
}
cameraInit();
initView();
}
protected void showToast(String string) {
Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
}
/**
* button点击事件
* @param v
*/
public void doClick(View v){
mCamera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if(success){
mCamera.takePicture(null, null, new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
savaHandler.post(new r(data));
}
});
}
}
});
}
/**
* 检测照相机功能是否可用
* @return
*/
public boolean checkCamera(){
if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
return true;
}
return false;
}
/**
* 给camera配置参数
*/
public void cameraInit(){
try {
mCamera = Camera.open();
mCamera.setDisplayOrientation(90); //默认是横屏的,这里设置竖屏
Camera.Parameters p = mCamera.getParameters();
p.setPreviewSize(1920, 1080);
p.setPictureSize(720, 360);
p.setPictureFormat(PixelFormat.JPEG);
p.set("jpeg-quality", 85);//照片质量
p.setRotation(90); //拍完后照片设置竖屏,默认也是横屏的
mCamera.setParameters(p);
} catch (Exception e) {
e.printStackTrace();
}
}
private void initView() {
surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);//添加监听
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
isPreview = true;
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if(surfaceHolder.getSurface() == null){
return;
}
mCamera.stopPreview();
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mCamera != null){
if(isPreview){
isPreview = false;
mCamera.stopPreview();
}
mCamera.release();
mCamera = null;
}
}
/**
* 保存图片线程
* @author Administrator
*
*/
private class r implements Runnable{
private byte[] mdata;
private File mFile;
public r(byte[] data) {
mdata = data;
mFile = new File(getSDFile(),System.currentTimeMillis()+".jpg");
}
@Override
public void run() {
if(mFile == null){
mainHandler.sendEmptyMessage(SAVA_FAILURE);
return;
}
Bitmap bitmap = BitmapFactory.decodeByteArray(mdata, 0, mdata.length);
Matrix matrix = new Matrix();
matrix.postScale(0.3f, 0.3f);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(),matrix,true);
OutputStream stream = null;
try {
stream = new FileOutputStream(mFile);
bitmap.compress(CompressFormat.JPEG, 100, stream);
stream.close();
mainHandler.sendEmptyMessage(SAVA_SUCCESS);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* 获取sdFile
*/
public File getSDFile(){
return Environment.getExternalStorageDirectory();
}
}
xml代码
<LinearLayout 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:orientation="vertical">
<SurfaceView
android:id="@+id/surfaceview"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="fill_parent" />
<Button
android:id="@+id/btnStartStop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Start"
android:onClick="doClick"
tools:context=".MainActivity" />
</LinearLayout>
记得加权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />