`
Aina_hk55HK
  • 浏览: 386257 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android Camera照相机

阅读更多
package com.Aina.Android;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * com.Aina.Android Pro_Camera
 * 
 * @author Aina.huang E-mail: 674023920@qq.com
 * @version 创建时间:2010 Jul 7, 2010 2:50:15 PM 类说明
 */
public class PreView extends SurfaceView implements SurfaceHolder.Callback {

	private SurfaceHolder holder = null;
	private Camera mCamera = null;
	private Bitmap mBitmap = null;

	public PreView(Context context) {
		super(context);
		Log.i("TAG", "PreView()");
		// TODO Auto-generated constructor stub
		holder = this.getHolder();
		holder.addCallback(this);
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		Log.i("TAG", "surfaceChanged");
		// TODO Auto-generated method stub
		Camera.Parameters parameters = mCamera.getParameters();
		parameters.setPictureFormat(PixelFormat.JPEG);//设置图片格式
		parameters.setPreviewSize(320, 480);//设置尺寸
//		parameters.setPictureSize(320, 480);//设置分辨率
		mCamera.setParameters(parameters);
		mCamera.startPreview();//开始预览
	}

	public void surfaceCreated(SurfaceHolder holder) {
		Log.i("TAG", "surfaceCreated");
		// TODO Auto-generated method stub
		mCamera = Camera.open();//启动服务
		try {
			mCamera.setPreviewDisplay(holder);//设置预览
		} catch (IOException e) {
			mCamera.release();//释放
			mCamera = null;
		}
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		Log.i("TAG", "surfaceDestroyed");
		// TODO Auto-generated method stub
		mCamera.stopPreview();//停止预览
		mCamera = null;
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode==KeyEvent.KEYCODE_DPAD_CENTER){
			if(mCamera !=null){
				mCamera.takePicture(null, null,pic);
			}
		}
		return super.onKeyDown(keyCode, event);
	}
	//拍照后输出图片
	public Camera.PictureCallback pic = new Camera.PictureCallback(){

		public void onPictureTaken(byte[] data, Camera camera) {
			// TODO Auto-generated method stub
			mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
			File f = new File(android.os.Environment.getExternalStorageDirectory()+"/camera1.jpg");
			try {
				BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(f));
				mBitmap.compress(Bitmap.CompressFormat.JPEG, 80, os);
				os.flush();
				os.close();
				Canvas canvas = holder.lockCanvas();
				canvas.drawBitmap(mBitmap, 0, 0, null);
				holder.unlockCanvasAndPost(canvas);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	};
}



package com.Aina.Android;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;

public class Test extends Activity {
    /** Called when the activity is first created. */
	private PreView pv = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        pv = new PreView(this);
        setContentView(pv);
    }

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		return pv.onKeyDown(keyCode, event);
	}
    
}


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.Aina.Android"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Test"
                  android:label="@string/app_name">
            <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-feature android:name="android.hardware.camera.autofocus" />

</manifest> 
分享到:
评论
7 楼 dai_lm 2012-07-12  
官方文档的说明
“Exception that is thrown from lockCanvas() when called on a Surface whose type is SURFACE_TYPE_PUSH_BUFFERS. ”

所以只能吧lockCanvas()那3句话删除
6 楼 ihopethatwell 2012-04-24  
楼主,我在你的这例子:FrameLayout fl = new FrameLayout(this);
pv = new PreView(this);
fl.addView(pv);
Button sureBtn = new Button(this);
sureBtn.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
sureBtn.setBackgroundColor(R.color.white);
sureBtn.setText("确定");
sureBtn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
pv.doTakePic();
}
});
fl.addView(sureBtn);

setContentView(fl);

但是点击拍照的时候却: android.view.SurfaceHolder$BadSurfaceTypeException: Surface type is SURFACE_TYPE_PUSH_BUFFERS 怎么办?
5 楼 yuky1327 2012-03-23  
03-23 12:30:58.386: E/AndroidRuntime(18502): FATAL EXCEPTION: main
03-23 12:30:58.386: E/AndroidRuntime(18502): android.view.SurfaceHolder$BadSurfaceTypeException: Surface type is SURFACE_TYPE_PUSH_BUFFERS
03-23 12:30:58.386: E/AndroidRuntime(18502): at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:761)
03-23 12:30:58.386: E/AndroidRuntime(18502): at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:752)
03-23 12:30:58.386: E/AndroidRuntime(18502): at cn.camera.PreView$1.onPictureTaken(PreView.java:107)
03-23 12:30:58.386: E/AndroidRuntime(18502): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:502)

楼主的代码运行之后会出现这个错误,请问怎么解决?
4 楼 xiebaolong 2011-03-30  
楼主确实很牛~~
3 楼 咖啡舞者 2011-02-12  
对KEYCODE_CAMERA进行监听可否?
如何第一阶进行对焦、彻底按下后拍照?(摄像按钮是分两阶的)
谢谢。
2 楼 yehoubin 2010-10-29  
你好,可以发个可以运行的例子给我吗?谢谢!yehoubin1987@163.com
1 楼 westice 2010-08-13  

看楼主对android蛮有研究的,请教一下。
我需要从摄像头得到连续的视频帧,用到了previewcallback这个回调,在模拟器中还是可以正常调用匿名内部类的方法,但是在真机里就一次也不执行了,这是什么原因,手机问题吗?有别的方法可以解决我的问题吗?谢了!

camera.setPreviewCallback(new Camera.PreviewCallback() {
			
			public void onPreviewFrame(byte[] data, Camera camera) {
				// TODO Auto-generated method stub
				  count ++;
			      char[] debuginfo = new char[20];
			      String s = "sendimage:"+Integer.toString(count);
			      debuginfo = s.toCharArray();
			      debugtext.setText(debuginfo, 0, debuginfo.length);
				   
			}
});


相关推荐

Global site tag (gtag.js) - Google Analytics