zoukankan      html  css  js  c++  java
  • 拍照

    在main.xml中:

    <LinearLayout

        xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:background="#000000">

      <Button

          android:id="@+id/but"

          android:layout_width="50dp"

          android:layout_height="fill_parent"

          android:background="#3399ff"

          android:textColor="#ffffff"

          android:text="照相"/>

      <SurfaceView

          android:id="@+id/surface"

          android:layout_width="fill_parent"

          android:layout_height="fill_parent"/>

    </LinearLayout>

    在MyCameraDemo.java中:

    package com.li.camera;

    import java.io.BufferedOutputStream;

    import java.io.File;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import android.annotation.SuppressLint;

    import android.app.Activity;

    import android.content.Context;

    import android.graphics.Bitmap;

    import android.graphics.BitmapFactory;

    import android.graphics.PixelFormat;

    import android.hardware.Camera;

    import android.hardware.Camera.AutoFocusCallback;

    import android.hardware.Camera.Parameters;

    import android.hardware.Camera.PictureCallback;

    import android.hardware.Camera.ShutterCallback;

    import android.os.Bundle;

    import android.os.Environment;

    import android.view.Display;

    import android.view.SurfaceHolder;

    import android.view.SurfaceView;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.view.WindowManager;

    import android.widget.Button;

    import android.widget.Toast;

    public class MyCameraDemo extends Activity {

      private SurfaceView surface = null ;

      private Button but = null ;

      private SurfaceHolder holder = null ;

      private Camera cam = null ;

      private boolean previewRunning =  true ;

      @Override

      public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         super.setContentView(R.layout.main);

         this.but = (Button) super.findViewById(R.id.but) ;

         this.surface = (SurfaceView) super.findViewById(R.id.surface) ;

        

         this.holder = this.surface.getHolder() ;

         this.holder.addCallback(new MySurfaceViewCallback()) ;

        this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) ;

         this.holder.setFixedSize(500, 350);

        

         this.but.setOnClickListener(new OnClickListenerImpl()) ;

      }

      private class OnClickListenerImpl implements OnClickListener {

         public void onClick(View v) {

           if(MyCameraDemo.this.cam != null) {

             MyCameraDemo.this.cam.autoFocus(new AutoFocusCallbackImpl()) ;

           }

         }

        

      }

      private class MySurfaceViewCallback implements SurfaceHolder.Callback {

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

             int height) {

          

         }

         @SuppressLint("NewApi")

         public void surfaceCreated(SurfaceHolder holder) {

           MyCameraDemo.this.cam = Camera.open(0) ;  // 取得第一个摄像头

           WindowManager manager = (WindowManager) MyCameraDemo.this

                .getSystemService(Context.WINDOW_SERVICE);

           Display display = manager.getDefaultDisplay() ;

           Parameters param = MyCameraDemo.this.cam.getParameters() ;

           param.setPreviewSize(display.getWidth(), display.getHeight()) ;

           param.setPreviewFrameRate(5) ; // 一秒5帧

           param.setPictureFormat(PixelFormat.JPEG) ;  // 图片形式

           param.set("jpen-quality", 80) ;

           MyCameraDemo.this.cam.setParameters(param) ;

           try {

             MyCameraDemo.this.cam.setPreviewDisplay(MyCameraDemo.this.holder) ;

           } catch (IOException e) {

           }

           MyCameraDemo.this.cam.startPreview() ;  // 进行预览

           MyCameraDemo.this.previewRunning = true ; // 已经开始预览

         }

         public void surfaceDestroyed(SurfaceHolder holder) {

           if(MyCameraDemo.this.cam != null) {

             if(MyCameraDemo.this.previewRunning) {

                MyCameraDemo.this.cam.stopPreview() ; // 停止预览

                MyCameraDemo.this.previewRunning = false ;

             }

             MyCameraDemo.this.cam.release() ;

           }

         }

        

      }

      private class AutoFocusCallbackImpl implements AutoFocusCallback {

         public void onAutoFocus(boolean success, Camera camera) {

           if(success) { // 成功

             MyCameraDemo.this.cam.takePicture(sc, pc, jpgcall) ;

           }

         }

        

      }

      private PictureCallback jpgcall = new PictureCallback() {

         public void onPictureTaken(byte[] data, Camera camera) {  // 保存图片的操作

           Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);

           String fileName = Environment.getExternalStorageDirectory()

                .toString()

                + File.separator

                + "liyewenphoto"

                + File.separator

                + "LYW" + System.currentTimeMillis() + ".jpg";

           File file = new File(fileName) ;

           if (!file.getParentFile().exists()) {

             file.getParentFile().mkdirs() ;  // 创建文件夹

           }

           try {

             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)) ;

             bmp.compress(Bitmap.CompressFormat.JPEG, 80, bos) ; // 向缓冲区之中压缩图片

             bos.flush() ;

             bos.close() ;

             Toast.makeText(MyCameraDemo.this,

                  "拍照成功,照片已保存在" + fileName + "文件之中!", Toast.LENGTH_SHORT)

                  .show();

           } catch (Exception e) {

             Toast.makeText(MyCameraDemo.this,

                  "拍照失败!", Toast.LENGTH_SHORT)

                  .show();

           }

           MyCameraDemo.this.cam.stopPreview() ;

           MyCameraDemo.this.cam.startPreview() ;

         }

        

      } ;

      private ShutterCallback sc = new ShutterCallback(){

         public void onShutter() {

           // 按下快门之后进行的操作

         }

      } ;

      private PictureCallback pc = new PictureCallback() {

         public void onPictureTaken(byte[] data, Camera camera) {

          

         }

        

      } ;

    }

    修改AndroidManifest.xml中:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

        package="com.li.camera"

        android:versionCode="1"

        android:versionName="1.0" >

        <uses-sdk

            android:minSdkVersion="8"

            android:targetSdkVersion="15" />

        <application

            android:icon="@drawable/ic_launcher"

            android:label="@string/app_name"

            android:theme="@style/AppTheme" >

            <activity

                android:name=".MyCameraDemo"

                android:label="@string/title_activity_my_camera_demo"

                android:screenOrientation="landscape">

                <intent-filter>

                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />

                </intent-filter>

            </activity>

        </application>

      <uses-feature android:name="android.hardware.camera" />

      <uses-feature android:name="android.hardware.camera.autofocus" />

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

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

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

    </manifest>

  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/riskyer/p/3317941.html
Copyright © 2011-2022 走看看