Android調(diào)用Camera實(shí)現(xiàn)自定義照相
作者:佚名 
  本文介紹了在Android開發(fā)中調(diào)用Camera實(shí)現(xiàn)自定義照相的具體實(shí)現(xiàn)代碼??梢灾苯蛹尤牍こ讨?,希望大家喜歡。
 首先是布局文件,線性布局,左邊兩個(gè)按鈕垂直擺放,右邊預(yù)覽圖以及照相獲取到的圖:
- <?xml version="1.0" encoding="utf-8"?>
 - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 - android:layout_width="fill_parent"
 - android:layout_height="fill_parent"
 - android:orientation="horizontal" >
 - <LinearLayout
 - android:layout_width="200dip"
 - android:layout_height="150dip"
 - android:orientation="vertical" >
 - <Button
 - android:id="@+id/btn1"
 - android:layout_width="80dip"
 - android:layout_height="50dip"
 - android:text="Start takPic" />
 - <Button
 - android:id="@+id/btn2"
 - android:layout_width="80dip"
 - android:layout_height="50dip"
 - android:text="Get Pic" />
 - </LinearLayout>
 - <LinearLayout
 - android:id="@+id/cameraView"
 - android:layout_width="200dip"
 - android:layout_height="150dip"
 - android:orientation="vertical" >
 - </LinearLayout>
 - </LinearLayout>
 
代碼,都寫在一起的。包含一個(gè)自定義的surfaceView(用于相機(jī)的照相預(yù)覽).以及activit:
- package com.nico;
 - import java.io.ByteArrayInputStream;
 - import java.io.IOException;
 - import android.app.Activity;
 - import android.content.Context;
 - import android.graphics.PixelFormat;
 - import android.graphics.drawable.BitmapDrawable;
 - import android.graphics.drawable.Drawable;
 - import android.hardware.Camera;
 - import android.os.Bundle;
 - import android.os.Environment;
 - import android.util.Log;
 - import android.view.SurfaceHolder;
 - import android.view.SurfaceView;
 - import android.view.View;
 - import android.view.Window;
 - import android.view.WindowManager;
 - import android.view.View.OnClickListener;
 - import android.widget.Button;
 - import android.widget.LinearLayout;
 - public class Test extends Activity implements OnClickListener {
 - /** Called when the activity is first created. */
 - // camera 類
 - private Camera camera = null;
 - // 繼承surfaceView的自定義view 用于存放照相的圖片
 - private CameraView cv = null;
 - // 回調(diào)用的picture,實(shí)現(xiàn)里邊的onPictureTaken方法,其中byte[]數(shù)組即為照相后獲取到的圖片信息
 - private Camera.PictureCallback picture = new Camera.PictureCallback() {
 - @Override
 - public void onPictureTaken(byte[] data, Camera camera) {
 - // 主要就是將圖片轉(zhuǎn)化成drawable,設(shè)置為固定區(qū)域的背景(展示圖片),當(dāng)然也可以直接在布局文件里放一個(gè)surfaceView供使用。
 - ByteArrayInputStream bais = new ByteArrayInputStream(data);
 - Drawable d = BitmapDrawable.createFromStream(bais, Environment
 - .getExternalStorageDirectory().getAbsolutePath()
 - + "/img.jpeg");
 - l.setBackgroundDrawable(d);
 - try {
 - } catch (Exception e) {
 - e.printStackTrace();
 - }
 - }
 - };
 - // 按鈕 布局等定義,不作贅述
 - Button btn1 = null;
 - Button btn2 = null;
 - LinearLayout l = null;
 - @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);
 - setContentView(R.layout.main);
 - l = (LinearLayout) findViewById(R.id.cameraView);
 - btn1 = (Button) findViewById(R.id.btn1);
 - btn2 = (Button) findViewById(R.id.btn2);
 - btn1.setOnClickListener(this);
 - btn2.setOnClickListener(this);
 - }
 - //主要的surfaceView,負(fù)責(zé)展示預(yù)覽圖片,camera的開關(guān)
 - class CameraView extends SurfaceView {
 - //
 - private SurfaceHolder holder = null;
 - public CameraView(Context context) {
 - super(context);
 - holder = this.getHolder();
 - holder.addCallback(new SurfaceHolder.Callback() {
 - @Override
 - public void surfaceChanged(SurfaceHolder holder, int format,
 - int width, int height) {
 - Camera.Parameters parameters = camera.getParameters();
 - //以下注釋掉的是設(shè)置預(yù)覽時(shí)的圖像以及拍照的一些參數(shù)
 - // parameters.setPictureFormat(PixelFormat.JPEG);
 - // parameters.setPreviewSize(parameters.getPictureSize().width,
 - // parameters.getPictureSize().height);
 - // parameters.setFocusMode("auto");
 - // parameters.setPictureSize(width, height);
 - camera.setParameters(parameters);
 - camera.startPreview();
 - }
 - @Override
 - public void surfaceCreated(SurfaceHolder holder) {
 - camera = Camera.open();
 - try {
 - //設(shè)置camera預(yù)覽的角度,因?yàn)槟J(rèn)圖片是傾斜90度的
 - camera.setDisplayOrientation(90);
 - //設(shè)置holder主要是用于surfaceView的圖片的實(shí)時(shí)預(yù)覽,以及獲取圖片等功能,可以理解為控制camera的操作..
 - camera.setPreviewDisplay(holder);
 - } catch (IOException e) {
 - camera.release();
 - camera = null;
 - e.printStackTrace();
 - }
 - }
 - @Override
 - public void surfaceDestroyed(SurfaceHolder holder) {
 - //顧名思義可以看懂
 - camera.stopPreview();
 - camera.release();
 - camera = null;
 - }
 - });
 - // holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 - }
 - }
 - @Override
 - public void onClick(View v) {
 - if (v == btn1) {
 - l.removeAllViews();
 - cv = new CameraView(Test.this);
 - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
 - LinearLayout.LayoutParams.FILL_PARENT,
 - LinearLayout.LayoutParams.FILL_PARENT);
 - l.addView(cv, params);
 - } else if (v == btn2) {
 - camera.takePicture(null, null, picture);
 - }
 - }
 - }
 
責(zé)任編輯:徐川 
                    來源:
                    ITEYE
 














 
 
 







 
 
 
 