androoid中SurfaceView加載照相機功能頁面

package com.example.surfaceview;

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.Parameters;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

/**
 * 
 * 使用SurfaceView加載照相機功能頁面
 * @author 淺議愛
 *
 */
public class MainActivity extends Activity {

    //定義控件
    private SurfaceView mSurfaceView;
    private Camera camera;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//      requestWindowFeature(Window.FEATURE_NO_TITLE); // 沒有標題  必須在設置佈局之前找到調用
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, // 設置全屏顯示
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        mSurfaceView=(SurfaceView) findViewById(R.id.mysurfaceview);
        SurfaceHolder holder = mSurfaceView.getHolder();
        holder.setFixedSize(176, 155);// 設置分辨率 
        holder.setKeepScreenOn(true);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        // SurfaceView只有當activity顯示到了前臺,該控件纔會被創建     因此需要監聽surfaceview的創建
          holder.addCallback(new MySurfaceCallback());

    }

     /**
       * 監聽surfaceview的創建
       * @author Administrator
       * Surfaceview只有當activity顯示到前臺,該空間纔會被創建
       */

    private final class MySurfaceCallback implements Callback{

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // TODO Auto-generated method stub
              // 當surfaceview創建就去打開相機
            try {
                camera = Camera.open();
                Parameters params = camera.getParameters();
                 Log.i("i", params.flatten());
                 params.setJpegQuality(80);  // 設置照片的質量
                 params.setPictureSize(1024, 768);
                 params.setPreviewFrameRate(5);  // 預覽幀率
                 camera.setParameters(params); // 將參數設置給相機
                 // 設置預覽顯示
                 camera.setPreviewDisplay(mSurfaceView.getHolder());
                 // 開啓預覽
                 camera.startPreview();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
       //改變時,,,不用執行任何操作
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
               if(camera != null){
                      camera.release();
                      camera = null;
                     }
        }

        public void autofoucs(View v){
         // 自動對焦由硬件來完成
          }

        /*
         * shutter:快門被按下
         * raw:相機所捕獲的原始數據
         * jpeg:相機處理的數據
         */   
        public void takepicture(View v){
         camera.takePicture(null, null, new MyPictureCallback());

         }

        //相機拍攝
        private final  class MyPictureCallback implements PictureCallback{

            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                // TODO Auto-generated method stub
            //將拍的照片保存到sd卡
             try {
                File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
                 FileOutputStream fos = new FileOutputStream(file);
                 fos.write(data);
                 // 在拍照的時候相機是被佔用的,拍照之後需要重新預覽
                  camera.startPreview();
            } catch (Exception e) {
                // TODO Auto-generated catch block
            }
            }

        }
    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    tools:context="com.example.surfaceview.MainActivity" >

    <SurfaceView
        android:id="@+id/mysurfaceview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.surfaceview"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />
    <!--  sd創建和刪除文件權限-->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <!-- 使用照相機權限 -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <!-- 寫入sd卡權限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity 
            android:screenOrientation="landscape"
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章