上次已经写过SurfaceView显示Camera摄像了,代码可以运行,但是里面有问题,这次纠正过来,顺便实现变焦:
代码:
- public class CameravedioActivity extends Activity{
-
- private static final String TAG = "CameravedioActivity";
- private Camera camera;
- private boolean preview = false ;
- private SeekBar mSeekBar;
- private SurfaceView surfaceView;
- private SurfaceHolder surfaceHolder;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
-
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.main);
- surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
- surfaceHolder = surfaceView.getHolder();
- surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- surfaceView.getHolder().setFixedSize(200, 200);
- surfaceView.getHolder().addCallback(new SurfaceViewCallback());
-
-
- mSeekBar = (SeekBar)findViewById(R.id.seekbar);
- mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
-
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress,
- boolean fromUser) {
-
- Log.d(TAG, "progress:"+progress);
- if(camera.getParameters().isZoomSupported()){
-
- Parameters params = camera.getParameters();
- params.setZoom(progress);
- camera.setParameters(params);
- }
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
-
- Log.d(TAG, "onStartTrackingTouch");
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
-
- Log.d(TAG, "onStartTrackingTouch");
- }
-
- });
- }
-
-
-
- @Override
- protected void onResume() {
-
- super.onResume();
-
- }
-
- 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;
- Log.d(TAG, "rotation:"+rotation);
- 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;
- } else {
- result = (info.orientation - degrees + 360) % 360;
- }
- camera.setDisplayOrientation(result);
- }
-
- private final class SurfaceViewCallback implements Callback {
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- Log.d(TAG,"surfaceCreated");
-
-
- Log.d(TAG, "numbers:"+Camera.getNumberOfCameras());
- if(Camera.getNumberOfCameras() ==2){
-
- camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
- camera.setDisplayOrientation(90);
- }else{
-
- camera = Camera.open();
- }
-
- Log.d(TAG, "smoothZoom:"+camera.getParameters().isSmoothZoomSupported());
- Log.d(TAG, "supportzoom:"+camera.getParameters().isZoomSupported());
- Log.d(TAG, "max zoom:"+camera.getParameters().getMaxZoom());
-
- try {
- camera.setPreviewDisplay(surfaceHolder);
- } catch (IOException e) {
-
- e.printStackTrace();
- }
-
- Camera.Parameters parameters = camera.getParameters();
-
- parameters.setPreviewFrameRate(5);
-
- parameters.setPictureFormat(PixelFormat.JPEG);
-
- parameters.set("jpeg-quality", 85);
- mSeekBar.setMax(parameters.getMaxZoom());
-
-
- List<Size> pszize = parameters.getSupportedPreviewSizes();
- if (null != pszize && 0 < pszize.size()) {
- int height[] = new int[pszize.size()];
- Map<Integer, Integer> map = new HashMap<Integer, Integer>();
- for (int i = 0; i < pszize.size(); i++) {
- Size size = (Size) pszize.get(i);
- int sizeheight = size.height;
- int sizewidth = size.width;
- height[i] = sizeheight;
- map.put(sizeheight, sizewidth);
- Log.d(TAG, "size.width:"+sizewidth+"\tsize.height:"+sizeheight);
- }
- Arrays.sort(height);
-
- parameters.setPreviewSize(map.get(height[0]),height[0]);
- }
-
-
- camera.setParameters(parameters);
- camera.startPreview();
-
- camera.setPreviewCallback(new Camera.PreviewCallback(){
-
- @Override
- public void onPreviewFrame(byte[] data, Camera camera) {
-
-
- }
-
- });
- preview = true;
- }
-
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- Log.d(TAG,"surfaceChanged");
- }
-
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
- if(camera != null) {
-
- if(preview) {
- camera.stopPreview();
- preview = false;
- }
-
- camera.setPreviewCallback(null);
- camera.release();
- }
- }
-
- }
-
- }
注册文件:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="cn.edu.wtu"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
-
- <activity android:name=".CameravedioActivity" android:label="@string/app_name" android:screenOrientation="portrait">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="7" />
-
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
-
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
- <uses-permission android:name="android.permission.CAMERA"/>
- </manifest>
布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical"
- >
- <SurfaceView
- android:id="@+id/surfaceView"
- android:layout_width="200dip"
- android:layout_height="150dip"
- android:layout_gravity="center"
- android:visibility="visible"
- />
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- >
- <SeekBar
- android:id="@+id/seekbar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="40dip"
- android:layout_marginRight="40dip"
- android:layout_gravity="center"
- android:progressDrawable="@android:color/transparent"
- android:background="@drawable/progressbar_box"
- />
- </LinearLayout>
- </LinearLayout>
- </FrameLayout>
seekbar用来实现调焦的
Android Camera(二)
原文:http://www.cnblogs.com/qingchen1984/p/4800996.html