Android開啟攝像頭拍照

4e48 9年前發布 | 3K 次閱讀 Java Android

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Calendar;

import java.util.Locale;

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.os.Bundle;

import android.text.format.DateFormat;

import android.util.Log;

import android.view.KeyEvent;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.Window;

import android.view.WindowManager;

import android.widget.FrameLayout;

import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends Activity {

private CameraView cv;

// 準備一個相機對象

private Camera mCamera = null;

// 準備一個Bitmap對象

private Bitmap mBitmap = null;

// 準備一個保存圖片的PictureCallback對象

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

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

        Log.i("yao", "onPictureTaken");

        Toast.makeText(getApplicationContext(), "正在保存……", Toast.LENGTH_LONG)
                .show();

        // 用BitmapFactory.decodeByteArray()方法可以把相機傳回的裸數據轉換成Bitmap對象

        mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

        // 接下來的工作就是把Bitmap保存成一個存儲卡中的文件

        File file = new File("/sdcard/YY"
                + new DateFormat().format("yyyyMMdd_hhmmss",
                        Calendar.getInstance(Locale.CHINA)) + ".jpg");

        try {

            file.createNewFile();

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

            mBitmap.compress(Bitmap.CompressFormat.PNG, 100, os);

            os.flush();

            os.close();

            Toast.makeText(getApplicationContext(), "圖片保存完畢,在存儲卡的根目錄",
                    Toast.LENGTH_LONG).show();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

};

// Activity的創建方法

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    // 窗口去掉標題

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // 窗口設置為全屏

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    // 設置窗口為半透明

    getWindow().setFormat(PixelFormat.TRANSLUCENT);

    // 提供一個幀布局

    FrameLayout fl = new FrameLayout(this);

    // 創建一個照相預覽用的SurfaceView子類,并放在幀布局的底層

    cv = new CameraView(this);

    fl.addView(cv);

    // 創建一個文本框添加在幀布局中,我們可以看到,文字自動出現在了SurfaceView的前面,由此你可以在預覽窗口做出各種特殊效果

    TextView tv = new TextView(this);

    tv.setText("請按\"相機\"按鈕拍攝");

    fl.addView(tv);

    // 設置Activity的根內容視圖

    setContentView(fl);

}

// 相機按鍵按下的事件處理方法

public boolean onKeyDown(int keyCode, KeyEvent event) {

    Log.i("yao", "MainActivity.onKeyDown");

    if (keyCode == KeyEvent.KEYCODE_CAMERA) {

        if (mCamera != null) {

            Log.i("yao", "mCamera.takePicture");

            // 當按下相機按鈕時,執行相機對象的takePicture()方法,該方法有三個回調對象做入參,不需要的時候可以設null

            mCamera.takePicture(null, null, pictureCallback);

        }

    }

    return cv.onKeyDown(keyCode, event);

}

// 照相視圖

class CameraView extends SurfaceView {

    private SurfaceHolder holder = null;

    // 構造函數

    public CameraView(Context context) {

        super(context);

        Log.i("yao", "CameraView");

        // 操作surface的holder

        holder = this.getHolder();

        // 創建SurfaceHolder.Callback對象

        holder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

                // 停止預覽

                mCamera.stopPreview();

                // 釋放相機資源并置空

                mCamera.release();

                mCamera = null;

            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {

                // 當預覽視圖創建的時候開啟相機

                mCamera = Camera.open();

                try {

                    // 設置預覽

                    mCamera.setPreviewDisplay(holder);

                } catch (IOException e) {

                    // 釋放相機資源并置空

                    mCamera.release();

                    mCamera = null;

                }

            }

            // 當surface視圖數據發生變化時,處理預覽信息

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format,
                    int width, int height) {

                // 獲得相機參數對象

                Camera.Parameters parameters = mCamera.getParameters();

                // 設置格式

                parameters.setPictureFormat(PixelFormat.JPEG);

                // 設置預覽大小,這里我的測試機是Milsstone所以設置的是854x480

                parameters.setPreviewSize(854, 480);

                // 設置自動對焦

                parameters.setFocusMode("auto");

                // 設置圖片保存時的分辨率大小

                parameters.setPictureSize(2592, 1456);

                // 給相機對象設置剛才設定的參數

                mCamera.setParameters(parameters);

                // 開始預覽

                mCamera.startPreview();

            }

        });

        // 設置Push緩沖類型,說明surface數據由其他來源提供,而不是用自己的Canvas來繪圖,在這里是由攝像頭來提供數據

        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

}

}


<?xml version="1.0" encoding="utf-8"?>

<manifest package="basic.android.lesson36" xmlns:android="http://schemas.android.com/apk/res/android&quot; android:versioncode="1" android:versionname="1.0">

    <application android:label="@string/app_name" android:icon="@drawable/icon">

            <activity android:label="@string/app_name" android:name=".MainActivity" android:screenorientation="landscape" android:configchanges="orientation|keyboardHidden|keyboard">

                    <intent -filter="">

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

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

                    </category></action></intent>

            </activity>


    </application>

    <uses -sdk="" android:minsdkversion="8">

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

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

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

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

</uses></uses></uses></manifest> </pre>

 本文由用戶 4e48 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!