自分のカメラを叶えて
Androidが持参したカメラアプリは、多くのシーンを満たすことができますが、柔軟性にはまだ不足しています.しかしAndroidは私たちに自分のCameraをカスタマイズすることを許可します.
AndroidのhardwareパッケージにはCameraクラスがあります.このクラスはCameraサービスを取得し、Cameraなどをカスタマイズすることができます.
Open()メソッドでインスタンスを取得できます.
このクラスを使用するにはAndroidManifestが必要です.xmlファイルに対応する権限と特性を追加
次のようになります.
など.
この例は次のとおりです.
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();
}
}