-------
源自梦想、永远是你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事业的好友、只是勇敢地说出我学到! ----------