转载自:http://blog.csdn.net/kesenhoo
直接使用代码演示:
【0】Manifest文件
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.hoo.picture"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name="TakePhotoActivity"
- android:label="@string/app_name"
- android:screenOrientation="landscape">
- <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.CAMERA"/>
- <!-- 在SDCard中创建与删除文件权限 -->
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <!-- 往SDCard写入数据权限 -->
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- </manifest>
【1】为主界面添加SurfaceView控件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <SurfaceView
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:id="@+id/surfaceView"
- />
- </LinearLayout>
【2】TakePhotoActivity.java
- /**
- * 拍照功能
- * @author kay
- */
- public class TakePhotoActivity extends Activity
- {
- private static final String TAG = "TakeActivity";
- private SurfaceView surfaceView;
- private Camera camera;
- private boolean preview;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- Window window = getWindow();
- //设置没有标题
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- //设置全屏
- window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
- //设置高亮
- window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
- setContentView(R.layout.main);
- surfaceView =(SurfaceView)this.findViewById(R.id.surfaceView);
- //设置分辨率
- surfaceView.getHolder().setFixedSize(176, 144);
- //设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前
- surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- surfaceView.getHolder().addCallback(new SurfaceCallback());
- }
- private final class SurfaceCallback implements SurfaceHolder.Callback
- {
- //画面变化时
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height)
- {
- }
- //画面创建时
- @Override
- public void surfaceCreated(SurfaceHolder holder)
- {
- try
- {
- //打开摄像头
- camera = Camera.open();
- WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- //构造摄像头参数
- Camera.Parameters parameters = camera.getParameters();
- //设置预览照片的大小
- parameters.setPreviewSize(display.getWidth(), display.getHeight());
- //设置每秒3帧
- parameters.setPreviewFrameRate(3);
- //设置照片的输出格式
- parameters.setPictureFormat(PixelFormat.JPEG);
- //设置照片质量
- parameters.set("jpeg-quality", 85);
- //设置照片的大小
- parameters.setPictureSize(display.getWidth(), display.getHeight());
- //设置摄像头参数
- camera.setParameters(parameters);
- //通过SurfaceView显示取景画面
- camera.setPreviewDisplay(surfaceView.getHolder());
- //开始预览照片
- camera.startPreview();
- preview = true;
- }
- catch (IOException e)
- {
- Log.e(TAG, e.toString());
- }
- }
- //画面关闭时
- @Override
- public void surfaceDestroyed(SurfaceHolder holder)
- {
- if(camera!=null)
- {
- if(preview) camera.stopPreview();
- camera.release();
- }
- }
- }
- //重写手机按钮事件
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event)
- {
- if(camera!=null && event.getRepeatCount()==0)
- {
- switch (keyCode)
- {
- case KeyEvent.KEYCODE_SEARCH:
- camera.autoFocus(null);//自动对焦
- break;
- //按下拍照键或者中间键,则拍照
- case KeyEvent.KEYCODE_CAMERA:
- case KeyEvent.KEYCODE_DPAD_CENTER:
- //此方法是异步的,不能在后面添加其他数据
- camera.takePicture(null, null, new TakePictureCallback());
- break;
- }
- }
- return true;
- }
- //使用内部类,拍照回调
- private final class TakePictureCallback implements PictureCallback
- {
- @Override
- public void onPictureTaken(byte[] data, Camera camera)
- {
- try
- {
- Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
- File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");
- FileOutputStream outStream = new FileOutputStream(file);
- //压缩文件
- bitmap.compress(CompressFormat.JPEG, 100, outStream);
- outStream.close();
- //关闭预览
- camera.stopPreview();
- //重新开始预览
- camera.startPreview();
- }
- catch (Exception e)
- {
- Log.e(TAG, e.toString());
- }
- }
- }
- }