Android 拍照 代码实例

------- 源自梦想永远是你IT事业的好友、只是勇敢地说出我学到! ----------

这是我做的一个简单的利用Android手机的摄像头进行拍照的实例。

在这里我实现了基本的拍照、照片的存储、自动对焦以及闪光灯,后续还需一些工作在以后我会一步步完成。

首先讲讲布局:


没错,就是这么简单的布局。我们先来实现拍照的基本功能,之后若是想要其他功能,一点一点加上去就可以了。

布局文件的代码如下,我们只需放进一个SurfaceView和一个ImageButton就可以了。

 

<FrameLayout 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"

    tools:context=".MainActivity" >

    

    <SurfaceView

        android:id="@+id/picSV"

        android:layout_width="match_parent"

    	android:layout_height="match_parent"

    	>

    </SurfaceView>

    

    <ImageButton

        android:onClick="tackpic"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="right|bottom"

        android:src="@android:drawable/ic_menu_camera" />

    

</FrameLayout>

 


既然我们使用到了摄像头,因此要增加权限:

 

<uses-permission android:name="android.permission.CAMERA"/>

 

由于之后还要把拍摄到的图片存到sdcard中,因此,在这里也一起加上写入sdcard的权限

 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

 

然后Androimanifest.xml中设置应用为横屏、全屏的:

 

Ctrl+点击  @style/AppTheme ,在 AppTheme中增加两行:

 

<item name="android:windowNoTitle">true</item>

<item name="android:windowFullscreen">true</item>

这样,当我们吧应用发布到手机的时候,布局默认就是横屏、全屏的效果。

 

下面就是要实现拍照功能了。为了方便,我就在代码中进行解读和注释:

 

package com.dongdong.tackpic;



import java.io.FileOutputStream;

import java.io.IOException;



import android.hardware.Camera;

import android.hardware.Camera.AutoFocusCallback;

import android.hardware.Camera.Parameters;

import android.hardware.Camera.PictureCallback;

import android.os.Bundle;

import android.app.Activity;

import android.view.SurfaceHolder;

import android.view.SurfaceHolder.Callback;

import android.view.SurfaceView;

import android.view.View;



public class MainActivity extends Activity {

	

	private SurfaceView picSV;

	private Camera camera;

	

	@SuppressWarnings("deprecation")

	@Override

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		picSV = (SurfaceView) findViewById(R.id.picSV);

		picSV.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

		picSV.getHolder().addCallback(new MyCallback());

	}

	

	private class MyCallback implements Callback{



		

		@Override

		public void surfaceCreated(SurfaceHolder holder) {//我们在SurfaceView创建的时候就要进行打开摄像头、设置预览取景所在的SurfaceView、设置拍照的参数、开启预览取景等操作

			try {

				camera = Camera.open();//打开摄像头

				camera.setPreviewDisplay(picSV.getHolder());//设置picSV来进行预览取景

				

				Parameters params = camera.getParameters();//获取照相机的参数

				params.setPictureSize(800, 480);//设置照片的大小为800*480

				params.setPreviewSize(800, 480);//设置预览取景的大小为800*480

				params.setFlashMode("on");//开启闪光灯

				params.setJpegQuality(50);//设置图片质量为50

				

				camera.setParameters(params);//设置以上参数为照相机的参数

				camera.startPreview();

			} catch (IOException e) {//开始预览取景,然后我们就可以拍照了

				e.printStackTrace();

			}

		}

		@Override

		public void surfaceChanged(SurfaceHolder holder, int format, int width,

				int height) {

		}

		@Override

		public void surfaceDestroyed(SurfaceHolder holder) {//当SurfaceView销毁时,我们进行停止预览、释放摄像机、垃圾回收等工作

			camera.stopPreview();

			camera.release();

			camera = null;

		}

		

	}

	public void tackpic(View v){

		camera.autoFocus(new MyAutoFocusCallback());//在我们开始拍照前,实现自动对焦

	}

	

	private class MyAutoFocusCallback implements AutoFocusCallback{



		@Override

		public void onAutoFocus(boolean success, Camera camera) {

			

			 camera.takePicture(null, null, null, new MyPictureCallback());//开始拍照

		}

		

	}

	

	private class MyPictureCallback implements PictureCallback{



		@Override

		public void onPictureTaken(byte[] data, Camera camera) {//将拍摄到的图片放到"/mnt/sdcard2/DCIM/Camera/"这个文件夹中

			try {

				FileOutputStream fos = new FileOutputStream("/mnt/sdcard2/DCIM/Camera/"+System.currentTimeMillis()+".jpg");

				fos.write(data);

				fos.close();

				camera.startPreview();

			} catch (Exception e) {

				e.printStackTrace();

			}

		}

		

	}

}


以上便实现了所说的功能, 利用Android手机里的摄像头进行拍照的具体步骤请见: http://blog.csdn.net/dongdong230/article/details/11480863

 


------- 源自梦想永远是你IT事业的好友、只是勇敢地说出我学到! ----------

 

你可能感兴趣的:(android)