android camera(1)

首先看看使用照相机的google SDK的说明。这个就自己慢慢看文档吧。接下来第一个实验是取景的照相机,后面的例子更加充实的,这就简单些。 先贴上代码:
package com.TestCamera1;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
public class TestCamera1Activity extends Activity {
    /** Called when the activity is first created. */
	private SurfaceHolder surfaceHolder;
    private Camera camera;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);       
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//强制横屏
        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
        surfaceHolder = surfaceView.getHolder();       
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().addCallback(new SurfaceViewCallback());
    }
    private final class SurfaceViewCallback implements SurfaceHolder.Callback {
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
    }
    public void surfaceCreated(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
        camera = Camera.open();
        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);//设置预览图的大小,很关键
        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 获取当前屏幕管理器对象
        Display display = wm.getDefaultDisplay();                 // 获取屏幕信息的描述类      
        Log.i("width|heigt",display.getWidth()+"|"+display.getHeight() );//获取屏幕的信息        
        parameters.setPreviewFrameRate(5);//设置预览图的帧数
        parameters.setPictureFormat(PixelFormat.JPEG);       
        parameters.set("jpeg-quality", 100);
        camera.setParameters(parameters);
        try {
            camera.setPreviewDisplay(surfaceHolder);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
        camera.startPreview();//开始预览
    }
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
        if (camera != null) {
            camera.stopPreview();//停止预览
        }
        camera.release();//释放照相机
        camera = null;
    }
    }
}
由google SDK看出要预览照片,首先需要一个surfaceHolder还需要一个Surfaceview来呈现预览图,否则没有办法预览了“Pass a fully initializedSurfaceHolder tosetPreviewDisplay(SurfaceHolder). Without a surface, the camera will be unable to start the preview.”这里有一篇介绍surfaceHolder的文章http://www.cnblogs.com/bausch/archive/2011/10/20/2219068.html

首先这个activity实现了SurfaceHolder.Callback接口,并重写了这个接口的三个方法。这个是必须实现的。大家看这三个方法的名字就知道他们的调用时机了。

虽然这个例子比较简单,但是有地方要注意的就是:
parameters.setPreviewSize(cameraSize.width, cameraSize.height);//设置预览图的大小,很关键
预览图的大小是不能随意设置的,否则就会报错setparameter fail。所以首先要查询一下自己的机型适合的大小,以下是方法:
Camera.Parameters parameters = mCamera.getParameters();   
// 选择合适的预览尺寸   
List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();   
Iterator<Camera.Size> itor1 = sizeList.iterator();   
while (itor1.hasNext()) {   
    Camera.Size cur1 = itor1.next();    
    Log.i("Camera Parameters:", cur1.width + "," + cur1.height);   
  
}  
附件下载:在我的资源页找android camera1
今晚就到这里,第一次写博客不太会写。下集更精彩,介绍如果拍照还有一些自己的感想

更新补充:
 parameters.setPreviewSize(cameraSize.width, cameraSize.height);
surfaceView.getWidth(),surfaceView.getHeight();
预览图的大小跟屏幕看到的surfaceview的大小可以不相等,可以说他们没有必然联系。在我实验中,surfaceview的宽高分别为300px,300px,而我的previewsize的宽高分别为640px,480px。这么小的surfaceview只是在屏幕观看的时候显得小而已。
那么这会导致什么后果呢?就是surfaceview跟预览图宽高不同,下节应该会有结果。我猜想是造成图片大小不一
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值