天天看點

android中的多媒體應用camera

MainActivity.java

代碼  

package com.amaker.ch11.app;  

import java.io.File;  

import java.io.FileOutputStream;  

import java.io.IOException;  

import android.app.Activity;  

import android.graphics.PixelFormat;  

import android.hardware.Camera;  

import android.os.AsyncTask;  

import android.os.Bundle;  

import android.os.Environment;  

import android.view.KeyEvent;  

import android.view.SurfaceHolder;  

import android.view.SurfaceView;  

public class MainActivity extends Activity {  

    // 聲明拍照界面元件SurfaceView  

    private SurfaceView surfaceView;  

    // 聲明界面控制元件SurfaceHolder  

    private SurfaceHolder surfaceHolder;  

    // 聲明照相機  

    private Camera camera;  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

        // 執行個體化拍照界面元件  

        surfaceView = (SurfaceView)findViewById(R.id.preview);  

        // 從SurfaceView中獲得SurfaceHolder  

        surfaceHolder = surfaceView.getHolder();  

        // 為SurfaceHolder 添加回調  

        surfaceHolder.addCallback(surfaceCallback);  

        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  

    }  

    // 響應按鍵事件  

    public boolean onKeyDown(int keyCode, KeyEvent event) {  

        if(keyCode==KeyEvent.KEYCODE_CAMERA||keyCode==KeyEvent.KEYCODE_SEARCH){  

            takePic();  

            return true;  

        }  

        return super.onKeyDown(keyCode, event);  

    // 拍照方法  

    private void takePic(){  

        // 停止預覽  

        camera.stopPreview();  

        // 拍照  

        camera.takePicture(null,null, pictureCallback);  

    // 照片回調  

    Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {  

        @Override  

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

            new SavePictureTask().execute(data);  

            camera.startPreview();  

    };  

    // 儲存照片任務類  

    class SavePictureTask extends AsyncTask<byte[],String,String>{  

        protected String doInBackground(byte[]... params) {  

            // 建立檔案  

            File picture = new File(Environment.getExternalStorageDirectory(),"picture.jpg");  

            // 如果檔案存在删除掉  

            if(picture.exists())picture.delete();  

            try {  

                // 獲得檔案輸出流  

                FileOutputStream  fos = new FileOutputStream(picture.getPath());  

                // 寫到該檔案  

                fos.write(params[0]);  

                // 關閉檔案流  

                fos.close();  

            } catch (Exception e) {  

                e.printStackTrace();  

            }  

            return null;  

    // SurfaceHodler 回調,處理打開相機,關閉相機以及照片尺寸的改變  

    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {  

        public void surfaceCreated(SurfaceHolder holder) {  

            // 打開相機  

            camera = Camera.open();  

                // 設定預覽  

                camera.setPreviewDisplay(holder);  

            } catch (IOException e) {  

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

                int height) {  

            // 獲得相機參數  

            Camera.Parameters parameters = camera.getParameters();  

            // 設定照片大小  

            parameters.setPreviewSize(width, height);  

            // 設定照片格式  

            parameters.setPictureFormat(PixelFormat.JPEG);  

            // 設定相機參數  

            camera.setParameters(parameters);  

            // 開始預覽  

        public void surfaceDestroyed(SurfaceHolder holder) {  

            // 停止預覽  

            camera.stopPreview();  

            // 釋放相機資源  

            camera.release();  

            camera = null;  

代碼

package com.amaker.ch11.app;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import android.app.Activity;

import android.graphics.PixelFormat;

import android.hardware.Camera;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Environment;

import android.view.KeyEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

public class MainActivity extends Activity {

    // 聲明拍照界面元件SurfaceView

    private SurfaceView surfaceView;

    // 聲明界面控制元件SurfaceHolder

    private SurfaceHolder surfaceHolder;

    // 聲明照相機

    private Camera camera;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        // 執行個體化拍照界面元件

        surfaceView = (SurfaceView)findViewById(R.id.preview);

        // 從SurfaceView中獲得SurfaceHolder

        surfaceHolder = surfaceView.getHolder();

        // 為SurfaceHolder 添加回調

        surfaceHolder.addCallback(surfaceCallback);

        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    // 響應按鍵事件

    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if(keyCode==KeyEvent.KEYCODE_CAMERA||keyCode==KeyEvent.KEYCODE_SEARCH){

            takePic();

            return true;

        }

        return super.onKeyDown(keyCode, event);

    // 拍照方法

    private void takePic(){

        // 停止預覽

        camera.stopPreview();

        // 拍照

        camera.takePicture(null,null, pictureCallback);

    // 照片回調

    Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

        @Override

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

            new SavePictureTask().execute(data);

            camera.startPreview();

    };

    // 儲存照片任務類

    class SavePictureTask extends AsyncTask<byte[],String,String>{

        protected String doInBackground(byte[]... params) {

            // 建立檔案

            File picture = new File(Environment.getExternalStorageDirectory(),"picture.jpg");

            // 如果檔案存在删除掉

            if(picture.exists())picture.delete();

            try {

                // 獲得檔案輸出流

                FileOutputStream  fos = new FileOutputStream(picture.getPath());

                // 寫到該檔案

                fos.write(params[0]);

                // 關閉檔案流

                fos.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

            return null;

    // SurfaceHodler 回調,處理打開相機,關閉相機以及照片尺寸的改變

    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {

        public void surfaceCreated(SurfaceHolder holder) {

            // 打開相機

            camera = Camera.open();

                // 設定預覽

                camera.setPreviewDisplay(holder);

            } catch (IOException e) {

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

                int height) {

            // 獲得相機參數

            Camera.Parameters parameters = camera.getParameters();

            // 設定照片大小

            parameters.setPreviewSize(width, height);

            // 設定照片格式

            parameters.setPictureFormat(PixelFormat.JPEG);

            // 設定相機參數

            camera.setParameters(parameters);

            // 開始預覽

        public void surfaceDestroyed(SurfaceHolder holder) {

            // 停止預覽

            camera.stopPreview();

            // 釋放相機資源

            camera.release();

            camera = null;

}

本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1079348

繼續閱讀