实例教程十三:拍照

 

不错的帖子:

仿UCWEB界面源码!
http://www.eoeandroid.com/thread-225509-1-1.html

Android MP3经典案例
http://www.eoeandroid.com/thread-212478-1-1.html

根据奇异高清UI界面源码 添加了一些功能
http://www.eoeandroid.com/thread-212872-1-1.html

Android 3D立体图片旋转
http://www.eoeandroid.com/thread-212512-1-1.html

------------帖子正文-----------------

原文链接:http://www.eoeandroid.com/thread-205293-1-1.html

拍照界面--main.xml

<?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"      android:orientation="vertical" >         <!-- 父界面 -->         <SurfaceView          android:id="@+id/sfvShow"          android:layout_width="fill_parent"          android:layout_height="fill_parent" />         <!-- 子界面 -->         <RelativeLayout          android:id="@+id/btnLayout"          android:layout_width="fill_parent"          android:layout_height="fill_parent"          android:visibility="gone" >             <Button              android:id="@+id/btnTakePicture"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_alignParentBottom="true"              android:layout_alignParentRight="true"              android:layout_marginRight="5dp"              android:onClick="takepicture"              android:text="@string/takepicture" />             <Button              android:id="@+id/btnAutoFocus"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:layout_alignTop="@id/btnTakePicture"              android:layout_marginRight="20dp"              android:layout_toLeftOf="@id/btnTakePicture"              android:onClick="takepicture"              android:text="@string/autoFocus" />      </RelativeLayout>     </FrameLayout>

拍照代码:MainActivity.java

package cn.itcast.picture;     import java.io.File;  import java.io.FileNotFoundException;  import java.io.FileOutputStream;  import java.io.IOException;     import android.app.Activity;  import android.hardware.Camera;  import android.hardware.Camera.PictureCallback;  import android.os.Bundle;  import android.os.Environment;  import android.util.Log;  import android.view.MotionEvent;  import android.view.SurfaceHolder;  import android.view.SurfaceHolder.Callback;  import android.view.SurfaceView;  import android.view.View;  import android.view.ViewGroup;  import android.view.Window;  import android.view.WindowManager;  import android.widget.RelativeLayout;     public class MainActivity extends Activity {          private RelativeLayout btnLayout;          private SurfaceView sfvShow;          private Camera camera;             @Override          public void onCreate(Bundle savedInstanceState) {                  super.onCreate(savedInstanceState);                     requestWindowFeature(Window.FEATURE_NO_TITLE); //设置窗口无标题                  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                                   WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏                  setContentView(R.layout.main);                     initView();                }                private void initView() {                  btnLayout = (RelativeLayout)this.findViewById(R.id.btnLayout);                  //得到SurfaceView显示控件 ,只有得到它,才能捕获摄像头画面                  sfvShow = (SurfaceView)this.findViewById(R.id.sfvShow);                     sfvShow.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);                  sfvShow.getHolder().setFixedSize(176, 144);                  sfvShow.getHolder().setKeepScreenOn(true); //使摄像头一直保持高亮                  sfvShow.getHolder().addCallback(new SurfaceCallback());          }             private final class SurfaceCallback implements Callback{                     @Override                  public void surfaceChanged(SurfaceHolder holder, int format, int width,                                  int height) {                          // TODO Auto-generated method stub                     }                     @Override                  public void surfaceCreated(SurfaceHolder holder) {                          try{                                  //打开摄像头                                  camera = Camera.open();                                  Camera.Parameters parameters = camera.getParameters();                                  parameters.setPreviewSize(640, 480);                                  parameters.setPreviewFrameRate(5);                                  parameters.setPictureSize(640, 480);                                  parameters.setJpegQuality(80);                                  camera.setParameters(parameters);                                  camera.setPreviewDisplay(holder);                                                                        //Log.i("摄像头参数", parameters.flatten());                          }catch(Exception e){                                  e.printStackTrace();                          }                     }                     @Override                  public void surfaceDestroyed(SurfaceHolder holder) {                          //一定要关闭摄像头,因为摄像头只能被一个使用                          if(camera != null){                                  camera.release();                                  camera = null;                          }                     }             }             //拍照          public void takepicture(View v){                  if(camera != null){                          switch (v.getId()) {                          case R.id.btnTakePicture:                                  camera.takePicture(null, null, new MyPictureCallBack());                                  break;                          case R.id.btnAutoFocus:                                  //不想得到对焦后的事件,传NULL                                  camera.autoFocus(null);                                  break;                          default:                                  break;                          }                  }          }             //经过压缩处理后的图片数据          private final class MyPictureCallBack implements PictureCallback{                  @Override                  public void onPictureTaken(byte[] data, Camera camera) {                          try{                                  File jpgFile = new File(Environment.getExternalStorageDirectory(),                                                  System.currentTimeMillis() + ".jpg");                                  //输出 流                                  FileOutputStream outStream = new FileOutputStream(jpgFile);                                  outStream.write(data);                                  outStream.close();                                  //代表摄像头处理完照片了                                  camera.startPreview(); //开始预览                          }catch (FileNotFoundException e) {                                  e.printStackTrace();                          }catch(IOException e){                                  e.printStackTrace();                          }                  }                          }             @Override          public boolean onTouchEvent(MotionEvent event) {                  if(event.getAction() == MotionEvent.ACTION_DOWN){                          btnLayout.setVisibility(ViewGroup.VISIBLE);                          return true; //返回true,销毁该事件,不要再往后传递了                  }                  return super.onTouchEvent(event);          }  }

清单文件:

<?xml version="1.0" encoding="utf-8"?>  <manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="cn.itcast.picture"      android:versionCode="1"      android:versionName="1.0" >         <uses-sdk android:minSdkVersion="8" />         <application          android:icon="@drawable/ic_launcher"          android:label="@string/app_name" >          <activity              android:name=".MainActivity"              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-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>

源码下载:takepicture.rar

你可能感兴趣的:(Android开发,移动开发,拍照)