80,337
社区成员
发帖
与我相关
我的任务
分享
package com.wlj.media;
import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.media.FaceDetector;
import android.media.FaceDetector.Face;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.FrameLayout;
public class TestCameraDemo extends Activity implements SurfaceHolder.Callback {
private static final String TAG = "我的调试:";
private Camera mCam;
private SurfaceView mCamSV;
private SurfaceHolder mCamSH=null;
private byte[] mFrame; //保留照片数据
private int mFrameWidth,mFrameHeight;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.surface_camera);
//初始设置相机参数
initCamera();
}
private void initCamera() {
mCamSV = (SurfaceView)findViewById(R.id.surface_camera);
mCamSH = mCamSV.getHolder();
mCamSH.addCallback(this);
//请注意这一行 问题所在
mCamSH.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void onDestroy() {
stopCamera();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
startCamera(holder, width, height);
}
public void surfaceCreated(SurfaceHolder holder) {
mCam = Camera.open();
Camera.Parameters p = mCam.getParameters();
mFrameWidth = p.getPreviewSize().width;
mFrameHeight = p.getPreviewSize().height;
mCam.setPreviewCallback(new PreviewCallback(){
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
synchronized (mCamSV) {
Log.i("TAG","mFrame:data="+(data.length));
mFrame = data;
Paint myPaint=new Paint();
myPaint.setColor(Color.GREEN);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeWidth(3);
//获取预览的图片,并且画图,画矩形
Canvas canvas = mCamSH.lockCanvas();
Bitmap bmp = dataToBmp(mFrame);
if (canvas != null) {
canvas.drawBitmap(bmp, 0,0, null);
canvas.drawRect(10,10,100,100, myPaint);
mCamSH.unlockCanvasAndPost(canvas);
}
}
}});
try {
mCam.setPreviewDisplay(holder);
} catch (IOException e) {
Log.e(TAG,e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
private void startCamera(SurfaceHolder sh, int width, int height) {
try{
mCam.startPreview();
}catch(Exception e)
{
Log.e(TAG,e.getMessage());
}
}
private void stopCamera() {
mCamSH.removeCallback(this);
mCam.stopPreview();
mCam.release();
}
Bitmap dataToBmp(byte[] data)
{
int frameSize = getFrameWidth() * getFrameHeight();
int[] rgba = new int[frameSize];
for (int i = 0; i < getFrameHeight(); i++)
for (int j = 0; j < getFrameWidth(); j++) {
int y = (0xff & ((int) data[i * getFrameWidth() + j]));
int u = (0xff & ((int) data[frameSize + (i >> 1) * getFrameWidth() + (j & ~1) + 0]));
int v = (0xff & ((int) data[frameSize + (i >> 1) * getFrameWidth() + (j & ~1) + 1]));
y = y < 16 ? 16 : y;
int r = Math.round(1.164f * (y - 16) + 1.596f * (v - 128));
int g = Math.round(1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
int b = Math.round(1.164f * (y - 16) + 2.018f * (u - 128));
r = r < 0 ? 0 : (r > 255 ? 255 : r);
g = g < 0 ? 0 : (g > 255 ? 255 : g);
b = b < 0 ? 0 : (b > 255 ? 255 : b);
//565
// r = r < 0 ? 0 : (r > 31 ? 31 : r);
// g = g < 0 ? 0 : (g > 63 ? 63 : g);
// b = b < 0 ? 0 : (b > 31 ? 31 : b);
rgba[i * getFrameWidth() + j] = 0xff000000 + (b << 16) + (g << 8) + r;
}
Bitmap bmp = null;
try {
bmp = Bitmap.createBitmap(rgba,getFrameWidth(), getFrameHeight(), Bitmap.Config.RGB_565);
} catch (Exception e) {
Log.e(TAG,"bmp图获取失败");
}
return bmp;
}
private int getFrameWidth() {
// TODO Auto-generated method stub
return this.mFrameWidth;
}
private int getFrameHeight() {
// TODO Auto-generated method stub
return this.mFrameHeight;
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surface_camera"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wlj.media"
android:versionCode="1"
android:versionName="1.0"
>
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:debuggable="true"
>
<activity android:name=".TestCameraDemo"
android:label="相机示例"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
</manifest>