自分のカメラを叶えて

5850 ワード

Androidが持参したカメラアプリは、多くのシーンを満たすことができますが、柔軟性にはまだ不足しています.しかしAndroidは私たちに自分のCameraをカスタマイズすることを許可します.
AndroidのhardwareパッケージにはCameraクラスがあります.このクラスはCameraサービスを取得し、Cameraなどをカスタマイズすることができます.
Open()メソッドでインスタンスを取得できます.
このクラスを使用するにはAndroidManifestが必要です.xmlファイルに対応する権限と特性を追加
 
次のようになります.
     
など.
この例は次のとおりです.
package demo.camera;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import android.app.Activity;
import android.content.ContentValues;
import android.content.res.Configuration;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.LinearLayout;
/**
 * Android   Camera            。               
 *          Camera。Android   Camera           Camera。
 *              Camera
 *   , Manifest       <uses-permission android:name="android:permission.CAMERA"/>
 *               ,      SurfaceView。
 *   SurfaceView   ,        SurfaceHolder,SurfaceHolder        ,    
 * Surface    ,      CallBack   。
 *         ,      Camera takePicture          Camera.PictureCallBack ,  onPictureTaken  
 * @author Administrator
 *
 */
public class MyCamera extends Activity implements SurfaceHolder.Callback,Camera.PictureCallback{
	
	public static final int MAX_WIDTH = 200;
	public static final int MAX_HEIGHT = 200;
	
	private SurfaceView surfaceView;
	
	private Camera camera; //   hardare Camera  
	
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.camera);
		surfaceView = (SurfaceView)this.findViewById(R.id.myCameraView);
		surfaceView.setFocusable(true); 
		surfaceView.setFocusableInTouchMode(true);
		surfaceView.setClickable(true);
		surfaceView.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				camera.takePicture(null, null, null, MyCamera.this);
				
			}
		});
		//SurfaceView  getHolder         SurfaceHolder  
		SurfaceHolder holder = surfaceView.getHolder();
		//          ,   SurfaceHolder      PUSH
		//  ,      Camera    ,        Surface 
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		holder.addCallback(this);
	}
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
	}
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		//  Surface      ,      ,        Camera  
		//     Camera    
		camera = Camera.open(); //  Camera  
	
		
		/**
		 * Camera          Camera.Parameters.     Camera       
		 *  Parameters      ,    Camera.setParameters()  ,         
		 *        ,Camera       ,      ,             ,     
		 *      setEffects       getSupportedColorEffects。           ,      
		 *     null
		 */
		try {
			
			Camera.Parameters param = camera.getParameters();
			if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){
				//     
				param.set("orientation", "portrait");
				// 2.2      
				//camera.setDisplayOrientation(90);
			}else{
				param.set("orientation", "landscape");
				// 2.2      
				//camera.setDisplayOrientation(0);				
			}
			//                 ,      ,   ;     
			List<String> colorEffects = param.getSupportedColorEffects();
			Iterator<String> colorItor = colorEffects.iterator();
			while(colorItor.hasNext()){
				String currColor = colorItor.next();
				if(currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)){
					param.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE);
					break;
				}
			}
			//          setParameter      
			camera.setParameters(param);
			
			camera.setPreviewDisplay(holder);
			
			/**
			 *        ,            Size
			 *            SIze      Size,  
			 *        SIZE,         SIZE        SIZE   
			 * Camera.Size     SIZE。
			 * 
			 */
			int bestWidth = 0;
			int bestHeight = 0;
			
			List<Camera.Size> sizeList = param.getSupportedPreviewSizes();
			//  sizeList               ,          
			if(sizeList.size() > 1){
				Iterator<Camera.Size> itor = sizeList.iterator();
				while(itor.hasNext()){
					Camera.Size cur = itor.next();
					if(cur.width > bestWidth && cur.height>bestHeight && cur.width <MAX_WIDTH && cur.height < MAX_HEIGHT){
						bestWidth = cur.width;
						bestHeight = cur.height;
					}
				}
				if(bestWidth != 0 && bestHeight != 0){
					param.setPreviewSize(bestWidth, bestHeight);
					//     SIze ,      SurfaceView,  ,Surface       ,  Camera        
					surfaceView.setLayoutParams(new LinearLayout.LayoutParams(bestWidth, bestHeight));
				}
			}
			camera.setParameters(param);
		} catch (Exception e) {
			//       ,   Camera  
			camera.release();
		}
		
		//      
		camera.startPreview();
		
	}
	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		//  Surface      ,      
		//       Camera  
		camera.stopPreview();
		camera.release();
		
	}
	@Override
	public void onPictureTaken(byte[] data, Camera camera) {
		// data      JPEG    ,
		//           ,       MediaStore
		//       ,    startPreview()    
		Uri imageUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
		try {
			OutputStream os = this.getContentResolver().openOutputStream(imageUri);
			os.write(data);
			os.flush();
			os.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		camera.startPreview();
	}
	
}