package com.wistron.WiCamera;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import Utilities.CSStaticData;
import Utilities.SystemInfo;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.hardware.Camera.Area;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.FaceDetectionListener;
import android.hardware.Camera.Parameters;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.location.Location;
import android.media.AudioManager;
import android.media.FaceDetector.Face;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.OrientationEventListener;
import android.view.TextureView;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import com.tridef.converter.DDD;
import com.tridef3d.graphics.Image3D;
import com.tridef3d.hardware.Display3D;
import com.tridef3d.view.TextureView3D;
import com.wistron.WiGallery.WiGalleryOpenGLRenderer;
import com.wistron.swpc.wicamera3dii.R;
/**
*
* @Copyright (c) 2011 Wistron SWPC All rights reserved.
*
* @created: 2012/02/21
* @filename: VideoSurfaceView.java
* @author WH1107063(周海江)
* @purpose 照相的surfaceView类,包含照相,连拍等操作
*
*
*
*
*/
public class VideoSurfaceView extends TextureView3D implements
TextureView.SurfaceTextureListener, Camera.PictureCallback,
InterSurfaceView, FaceDetectionListener {
public Camera cameras;
ArrayList<byte[]> list;
public MediaPlayer m_mediaplayer;
public int photonum = 0;
public static Handler handler;
// SurfaceHolder camera_holder;
public Context m_context;
public SoundPlayer soundPlayer;
// 判断对camera的操作,如连拍,单拍等
// public static int CAMERA_STATE = 0;
public static String[] VIDEO_ARRRAY;
// 对焦的状态
public static int FOCU_STATE = 0;
// 剩余空间
public String spareSpace;
// 对焦回调
AutoFocusCallback myAutoFocusCallback;
// 连拍的最后一张图片的路径
public String CAMERA_CONTINUOUS_LASTPICPATH;
// 录制文件的路径
public static String M_VIDEOPATH = "";
// 设置焦距的当前视图区域
public List<Area> mFocusArea;
// 设置感光度的当前视图区域
public List<Area> mMeteringArea;
public ImageView camera_focusImageView;
public Button camera_spareSpace;
public ImageView camera_newpic_thumbnails;
public Button camera_continuous;
public static boolean ok = false;
public ArrayList<String> continous_array;
// camera参数
public Parameters camera_parameters;
int previewwidth;
int previewheight;
// m_recorder对象
public MediaRecorder m_recorder = null;
// 视频文件
public File m_videofile;
// 是否在录制状态
public boolean m_isrecord = false;
// 前置后置照相头
public int m_camera_front = 0;
public int m_camera_back = 0;
// 使用摄像头的位置0 默认,1前置
public int m_cameraIndex = 0;
public Matrix mMatrix = new Matrix();;
public boolean m_isPreview = false; // 是否在预览中
public int mCurrentDegree;
// public static String newpicsize = "0";
Face[] mFaces;
public boolean isFacedetectSupported = false;
public boolean m_isreview = true;
// public OnClickListener camera_onClickListener;
public boolean m_isfacedetection = true;
public Rect[] oldRect = new Rect[0];
public ImageView camera_review_thumbnails;
public ArrayList<String> VIDEO_FILE_LIST;
public ArrayList<String> PIC_FILE_LIST;
public Location m_location;
public GetGPSInfo m_getGpsInfo;
AudioManager audioManager;
public boolean isToFocusToCapture = false;
public boolean isfocuskeyDown = false;
public TextureView3D mTextureView;
public SurfaceTexture mSurfaceTexture;
int mVideoWidth = 640;
int mVideoHeight = 480;
SystemInfo si = new SystemInfo();
public ArrayList<String> getVideoFileList() {
return VIDEO_FILE_LIST;
}
public void setVideoFileList(ArrayList<String> lst) {
this.VIDEO_FILE_LIST = lst;
}
public ArrayList<String> getPicFileList() {
return PIC_FILE_LIST;
}
public void setPicFileList(ArrayList<String> lst) {
this.PIC_FILE_LIST = lst;
}
public int getPreviewFormat() {
// TODO Auto-generated method stub
return camera_parameters.getPreviewFormat();
}
public List<Size> getSupportedPreviewSizes() {
// TODO Auto-generated method stub
camera_parameters = cameras.getParameters();
return camera_parameters.getSupportedPreviewSizes();
}
public void soundPlayerRelease() {
// TODO Auto-generated method stub
soundPlayer.release();
}
@Override
public Size getPictureSize() {
return camera_parameters.getPictureSize();
}
public String getVideoPath() {
return M_VIDEOPATH;
}
public void setVideoPath(String path) {
this.M_VIDEOPATH = path;
}
public VideoSurfaceView(Context context, AttributeSet paramAttributeSet) {
super(context, paramAttributeSet);
mTextureView = VideoSurfaceView.this;
System.out.println("VideoSurfaceView init" + mTextureView);
mTextureView.setSurfaceTextureListener(this);
// mTextureView.enable3D(true);
mTextureView.force3DMode(Display3D.MODE_2D);
m_context = context;
// camera_holder = getHolder();
// camera_holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// camera_holder.setKeepScreenOn(true);
// camera_holder.addCallback(this);
m_recorder = new MediaRecorder();
StoredData.init(context);
// VIDEO_FILE_LIST = new ArrayList<String>();
// PIC_FILE_LIST = new ArrayList<String>();
m_getGpsInfo = new GetGPSInfo(m_context);
m_getGpsInfo.getGps();
list = new ArrayList<byte[]>();
photonum = 0;
if (continous_array != null) {
continous_array.clear();
continous_array = null;
}
continous_array = new ArrayList<String>();
audioManager = (AudioManager) m_context
.getSystemService(Service.AUDIO_SERVICE);
// 对焦的回调类
myAutoFocusCallback = new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
// TODO Auto-generated method stub
if (isToFocusToCapture) {
PlaySounds(1);
// if(success){
cameras.takePicture(null, null, null, VideoSurfaceView.this);
isToFocusToCapture = false;
camera_focusImageView.setVisibility(View.GONE);
return;
// }
}
if (isfocuskeyDown) {
PlaySounds(1);
isfocuskeyDown = false;
// camera_focusImageView.setVisibility(View.GONE);
// handler.sendEmptyMessageDelayed(CAMERA_FOCUAREA, 3000);
return;
}
System.out.println("对焦的回调哦、、、、、、、、、、、、、、、");
if (m_isfacedetection) {
if (success) {
FOCU_STATE = STATE_SUCCESS;
} else {
FOCU_STATE = STATE_FAIL;
}
if (cameras != null) {
cameras.cancelAutoFocus();
// setFocusMode(1);
}
System.out.println(" 自动对讲回调sss");
} else {
if (FOCU_STATE == STATE_FOCUSING_SNAP_ON_FINISH) {
if (success) {
// PlaySounds();
FOCU_STATE = STATE_SUCCESS;
} else {
FOCU_STATE = STATE_FAIL;
}
myTakePic();
} else if (FOCU_STATE == STATE_FOCUSING) {
if (success) {
FOCU_STATE = STATE_SUCCESS;
PlaySounds(1);
} else {
FOCU_STATE = STATE_FAIL;
}
System.out.println(" 自动对讲回调");
}
handler.removeMessages(CAMERA_FOCUAREA);
handler.sendEmptyMessageDelayed(CAMERA_FOCUAREA, 3000);
}
}
};
// 接受对camera操作发回的消息,并做相应的处理
handler = new Handler() {
public void handleMessage(Message msg) {
int what = msg.what;
switch (what) {
case CAMERA_SINGLE_SHOT:
camera_newpic_thumbnails.setVisibility(View.VISIBLE);
camera_newpic_thumbnails.setAlpha(255);
WiCameraActivity.newpic_thumbnails_parent
.setVisibility(View.VISIBLE);
storedImage(singleData, -1);
Bitmap bitmap = OperationFile.fitSizeImg(
CAMERA_CONTINUOUS_LASTPICPATH, 90, 90, 90);
camera_newpic_thumbnails.setImageBitmap(bitmap);
spareSpace = OperationFile.readSDCard();
camera_spareSpace.setText(spareSpace + "");
if (WiCameraActivity.mCurrentDegree == 90) {
WiCameraActivity.m_al_camera_overlayui.postInvalidate();
}
boolean m_isReview = StoredData.getBoolean(
StoredData.M_REVIEW, true);
// WiCameraActivity.m_btn_camera_captureorrecord
// .setEnabled(true);
if (m_isReview) {
Bitmap bit = null;
// Bitmap bits = BitmapFactory
// .decodeFile(CAMERA_CONTINUOUS_LASTPICPATH);
if (WiCameraActivity.mCurrentDegree == 90) {
bit = OperationFile.fitSizeImg(
CAMERA_CONTINUOUS_LASTPICPATH,
previewheight / 2, previewheight / 2,
previewwidth / 2);
WiCameraActivity.M_ISLANSCAPE = false;
} else if (WiCameraActivity.mCurrentDegree == 360) {
bit = OperationFile.fitSizeImg(
CAMERA_CONTINUOUS_LASTPICPATH,
previewheight / 2, previewwidth / 2,
previewheight / 2);
WiCameraActivity.M_ISLANSCAPE = true;
}
camera_review_thumbnails.setImageBitmap(bit);
((WiCameraActivity) (m_context)).isShowReview(true);
}
WiCameraActivity.m_main_handle.removeMessages(3);
WiCameraActivity.m_main_handle.sendEmptyMessageDelayed(3,
500);
if (soundPlayer != null) {
soundPlayer.release();
}
break;
case CAMERA_CONTINUOUS:
camera_newpic_thumbnails.setVisibility(View.VISIBLE);
camera_newpic_thumbnails.setAlpha(255);
WiCameraActivity.newpic_thumbnails_parent
.setVisibility(View.VISIBLE);
int numindex = StoredData.getInt(
StoredData.M_CONTINUESHOTNUM, 0);
int maxnum = CAMERA_CONTINUESHOTNUMARRAY[numindex];
boolean is3D = StoredData.getBoolean(StoredData.M_CAMERA3D,
false);
for (int i = 0; i < list.size(); i++) {
// if(is3D){
saveImage(list.get(i), i);
// }
// storedImage(list.get(i), i);
if ((i + 1) == maxnum) {
Bitmap bm = OperationFile.fitSizeImg(
continous_array.get(0), 90, 90, 90);
camera_newpic_thumbnails.setImageBitmap(bm);
// camera_newpic_thumbnails
// .setVisibility(View.VISIBLE);
// camera_newpic_thumbnails.setAlpha(255);
}
}
System.gc();
spareSpace = OperationFile.readSDCard();
camera_spareSpace.setText(spareSpace + "");
if (WiCameraActivity.mCurrentDegree == 90) {
WiCameraActivity.m_al_camera_overlayui.postInvalidate();
}
// camera_continuous.setEnabled(true);
// WiCameraActivity.m_btn_camera_captureorrecord
// .setEnabled(true);
boolean m_isReviews = StoredData.getBoolean(
StoredData.M_REVIEW, true);
if (m_isReviews) {
Bitmap bit = null;
// Bitmap bits = BitmapFactory
// .decodeFile(CAMERA_CONTINUOUS_LASTPICPATH);
if (WiCameraActivity.mCurrentDegree == 90) {
bit = OperationFile.fitSizeImg(
continous_array.get(0), previewheight / 2,
previewheight / 2, previewwidth / 2);
WiCameraActivity.M_ISLANSCAPE = false;
} else if (WiCameraActivity.mCurrentDegree == 360) {
bit = OperationFile.fitSizeImg(
continous_array.get(0), previewheight / 2,
previewwidth / 2, previewheight / 2);
WiCameraActivity.M_ISLANSCAPE = true;
}
camera_review_thumbnails.setImageBitmap(bit);
((WiCameraActivity) (m_context)).isShowReview(true);
}
WiCameraActivity.m_main_handle.removeMessages(4);
WiCameraActivity.m_main_handle.sendEmptyMessageDelayed(4,
500);
if (soundPlayer != null) {
soundPlayer.release();
}
list = new ArrayList<byte[]>();
photonum = 0;
if (continous_array != null) {
continous_array.clear();
continous_array = null;
}
continous_array = new ArrayList<String>();
break;
case CAMERA_FOCUAREA:
if (cameras != null) {
startFaceDetection();
// cameras.cancelAutoFocus();
m_isfacedetection = true;
int flashMode = StoredData.getInt(
StoredData.M_FLASHMODE, 0);
setFlashMode(flashMode);
// setFocusMode(1);
camera_focusImageView.setVisibility(View.GONE);
}
break;
case CAMERA_SELFTIME:
Util.CAMERA_STATE = CAMERA_SELFTIME;
StoredData.saveInt(StoredData.M_CAMERA_STATE,
CAMERA_SELFTIME);
if (cameras != null) {
// Util.setRotationParameter(camera_parameters,
// m_cameraIndex, WiCameraActivity.mOrientation);
// cameras.setParameters(camera_parameters);
setRotationParm();
}
if (FOCU_STATE == STATE_FOCUSING) {
FOCU_STATE = STATE_FOCUSING_SNAP_ON_FINISH;
} else {
if (cameras != null) {
// cameras.takePicture(null, null, null,
// VideoSurfaceView.this);
cameras.cancelAutoFocus();
isToFocusToCapture = true;
cameras.autoFocus(myAutoFocusCallback);
}
}
break;
case CAMERA_CONTINUOUSANDSELFTIME:
Util.CAMERA_STATE = CAMERA_CONTINUOUSANDSELFTIME;
StoredData.saveInt(StoredData.M_CAMERA_STATE,
CAMERA_CONTINUOUSANDSELFTIME);
if (cameras != null) {
// Util.setRotationParameter(camera_parameters,
// m_cameraIndex, WiCameraActivity.mOrientation);
// cameras.setParameters(camera_parameters);
setRotationParm();
}
if (FOCU_STATE == STATE_FOCUSING) {
FOCU_STATE = STATE_FOCUSING_SNAP_ON_FINISH;
} else {
if (cameras != null) {
cameras.takePicture(null, null, null,
VideoSurfaceView.this);
}
}
break;
case CAMERA_VIDEO:
startRecord();
break;
default:
break;
}
};
};
}
/*
* (non-Javadoc)
*
* 对焦
*/
@Override
public void camerasFocus(boolean isfocuskeyup) {
isfocuskeyDown = true;
cameras.cancelAutoFocus();
cameras.autoFocus(myAutoFocusCallback);
}
/*
* (non-Javadoc)
*
* 硬件连拍是设置是连拍模式还是单拍模式
*/
@Override
public void isSingleModes(boolean isSingle) {
if (isSingle) {
setContinueMode(0);
stopPreview();
startPreview();
continueNum(1);
} else {
int num = StoredData.getInt(StoredData.M_CONTINUESHOTNUM, 0);
setContinueMode(1);
stopPreview();
startPreview();
continueNum(InterSurfaceView.CAMERA_CONTINUESHOTNUMARRAY[num]);
}
}
// 0为一般模式 1为连拍模式
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#setContinueMode(int)
*/
@Override
public void setContinueMode(int mode) {
if (cameras != null) {
Camera.Parameters p = cameras.getParameters();
p.set("camera-mode", mode);
cameras.setParameters(p);
}
}
/**
* 取消对焦
*/
public void cancalAutoFocus() {
if (cameras != null) {
cameras.cancelAutoFocus();
camera_focusImageView.setVisibility(View.GONE);
}
}
/*
* (non-Javadoc)
*
* 设置连拍的张数
*/
@Override
public void continueNum(int num) {
try {
Runtime.getRuntime().exec(
"adb shell setprop persist.camera.snapshot.number " + num);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* 设置3D和2D的切换
*/
@Override
public void is3D(boolean is3D) {
if (is3D) {
si.setScreenDimension(true);
mTextureView.force3DMode(Display3D.VERTICAL_INTERLACED);
} else {
si.setScreenDimension(false);
mTextureView.force3DMode(Display3D.MODE_2D);
}
}
/*
* (non-Javadoc)
*
* 初始化camera参数
*/
@Override
public void initParm() {
cameras.stopPreview();
// setPreviewSize();
setPreviewSize(800, 480);
setFlashMode(2);
camera_parameters.set("iso", "auto");
cameras.setParameters(camera_parameters);
// setSceneMode();
// setWhiteBalanceMode();
// setExposure();
// setFocusMode(1);
setPictureSize();
setWhiteBalanceMode();
setExposure();
cameras.startPreview();
}
/*
* (non-Javadoc)
*
* 初始化变量
*/
@Override
public void setSize(int previewwidth, int previewheight) {
// if (VIDEO_FILE_LIST == null) {
// VIDEO_FILE_LIST = new ArrayList<String>();
// }
// if (PIC_FILE_LIST == null) {
// PIC_FILE_LIST = new ArrayList<String>();
// }
this.previewwidth = previewwidth;
this.previewheight = previewheight;
camera_focusImageView = WiCameraActivity.m_iv_camera_focus;
camera_spareSpace = WiCameraActivity.m_btn_camera_newpic_sizeofsum;
camera_newpic_thumbnails = WiCameraActivity.m_iv_camera_newpic_thumbnails;
camera_continuous = WiCameraActivity.m_btn_camera_continuous;
camera_review_thumbnails = WiCameraActivity.m_iv_camera_review_thumbnails;
spareSpace = OperationFile.readSDCard();
// camera_spareSpace.setText(spareSpace + "/" + "" + newpicsize + "M");
// System.out.println("setSize=" + camera_spareSpace.getText());
Bitmap bit = null;
String preReviewPath = StoredData.getString(
StoredData.M_REVIEWFILEPATH, "a");
System.out.println("保存路径为:" + preReviewPath);
if (preReviewPath.equals("a")) {
// camera_newpic_thumbnails.setImageBitmap(BitmapFactory
// .decodeResource(getResources(), R.drawable.gray));
camera_newpic_thumbnails.setBackgroundResource(R.drawable.gray);
WiCameraActivity.newpic_thumbnails_parent.setVisibility(View.GONE);
return;
} else {
File f = new File(preReviewPath);
if (f.exists()) {
if (preReviewPath.endsWith("mp4")) {
bit = OperationFile.getVideotThumbnail(preReviewPath, 90,
90);
} else {
bit = OperationFile.fitSizeImg(preReviewPath, 90, 90, 90);
}
camera_newpic_thumbnails.setImageBitmap(bit);
} else {
// camera_newpic_thumbnails.setImageBitmap(BitmapFactory
// .decodeResource(getResources(), R.drawable.gray));
WiCameraActivity.newpic_thumbnails_parent
.setVisibility(View.GONE);
camera_newpic_thumbnails.setBackgroundResource(R.drawable.gray);
}
}
// if (bit != null) {
// bit.recycle();
// }
list = new ArrayList<byte[]>();
photonum = 0;
if (continous_array != null) {
continous_array.clear();
continous_array = null;
}
continous_array = new ArrayList<String>();
// camera_onClickListener = new OnClickListener() {
//
// @Override
// public void onClick(View v) {
// // TODO Auto-generated method stub
// int clickcount = 0;
// switch (v.getId()) {
// case R.id.btn_camera_capture:
// if (CAMERA_STATE != CAMERA_VIDEO) {
//
// setSelfTime();
// } else {
// if (clickcount % 2 == 0) {
//
// } else {
//
// }
// ++clickcount;
// }
//
// break;
// case R.id.btn_camera_continuous:
// // TODO Auto-generated method stub
// camera_continuous.setEnabled(false);
//
// if (cameras != null) {
// Util.setRotationParameter(camera_parameters,
// m_cameraIndex, WiCameraActivity.mOrientation);
// cameras.setParameters(camera_parameters);
// }
// list = new ArrayList<byte[]>();
// photonum = 0;
// StoredData.saveInt(StoredData.M_CAMERA_STATE,
// CAMERA_CONTINUOUS);
// CAMERA_STATE = CAMERA_CONTINUOUS;
//
// if (FOCU_STATE == STATE_FOCUSING) {
// FOCU_STATE = STATE_FOCUSING_SNAP_ON_FINISH;
// } else {
// myTakePic();
// }
// break;
// case R.id.btn_camera_used_camera:
// switchCamera();
// break;
// default:
// break;
// }
// }
// };
}
/*
* (non-Javadoc)
*
* 连拍
*/
@Override
public void continueCapture() {
// camera_continuous.setEnabled(false);
int time = StoredData.getInt(StoredData.M_SELFTIMER, 0);
if (cameras != null) {
// Util.setRotationParameter(camera_parameters, m_cameraIndex,
// WiCameraActivity.mOrientation);
// cameras.setParameters(camera_parameters);
setRotationParm();
}
// list = new ArrayList<byte[]>();
// photonum = 0;
// if (continous_array != null) {
// continous_array.clear();
// continous_array = null;
// }
// continous_array = new ArrayList<String>();
StoredData.saveInt(StoredData.M_CAMERA_STATE,
CAMERA_CONTINUOUSANDSELFTIME);
// CAMERA_STATE = CAMERA_CONTINUOUS;
if (FOCU_STATE == STATE_FOCUSING) {
FOCU_STATE = STATE_FOCUSING_SNAP_ON_FINISH;
} else {
// myTakePic();
handler.sendEmptyMessageDelayed(CAMERA_CONTINUOUSANDSELFTIME, 0);
}
}
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#isMute(boolean)
*/
@Override
public void isMute(boolean isMute) {
audioManager.setStreamMute(AudioManager.STREAM_MUSIC, isMute); // 设置是否静音
// if(isMute){
//
// audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
// audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
// AudioManager.VIBRATE_SETTING_OFF);
// audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,
// AudioManager.VIBRATE_SETTING_OFF);
// }else{
// audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
// audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
// AudioManager.VIBRATE_SETTING_OFF);
// audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,
// AudioManager.VIBRATE_SETTING_OFF);
// }
}
/*
* (non-Javadoc)
*
* 设置对焦模式
*/
@Override
public void setFocusMode(int focusmode) {
try {
if (cameras != null) {
cameras.cancelAutoFocus();
boolean videosupported = camera_parameters
.isVideoSnapshotSupported();
boolean isfocusmodesupported = isSupported(
CAMERA_FOCUSMODE[focusmode],
camera_parameters.getSupportedFocusModes());
if (focusmode == 2 && videosupported) {
camera_parameters.setFocusMode(CAMERA_FOCUSMODE[focusmode]);
} else if (focusmode == 1) {
if (isfocusmodesupported) {
camera_parameters
.setFocusMode(CAMERA_FOCUSMODE[focusmode]);
} else {
camera_parameters.setFocusMode(CAMERA_FOCUSMODE[0]);
}
}
// cameras.startSmoothZoom(m_zoomValue);
cameras.setParameters(camera_parameters);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* 转换前后照相头
*/
// boolean isRear = true;
@Override
public boolean switchCamera() {
WiCameraActivity.m_fd_face.setVisibility(View.GONE);
boolean isRear = true;
m_isPreview = false;
if (m_cameraIndex == m_camera_back) {
m_cameraIndex = m_camera_front;
StoredData.saveBoolean("isRear", false);
isRear = false;
} else if (m_cameraIndex == m_camera_front) {
m_cameraIndex = m_camera_back;
StoredData.saveBoolean("isRear", true);
isRear = true;
}
if (!m_isPreview && cameras != null) {
cameras.stopPreview();
cameras.release();
cameras = null;
try {
cameras = Camera.open(m_cameraIndex);
m_isPreview = true;
} catch (Exception e) {
if (m_cameraIndex == m_camera_front) {
m_cameraIndex = m_camera_back;
} else {
m_cameraIndex = m_camera_front;
}
}
}
if (cameras != null && m_isPreview) {
try {
// mTextureView.setInputFormat(800, 480, Image3D.LAYOUT_2D, 1.0,
// false, true, Image3D.QUALITY_FASTEST);
// 设定照相类型
cameras.setPreviewTexture(mSurfaceTexture);
camera_parameters = cameras.getParameters();
// setFocusMode(1);
// updateCameraParametersInitialize();
// setPreviewSize();
startPreview();
System.out.println("切换照相头哦....");
m_isPreview = true;
} catch (Exception e) {
cameras.release(); // 释放摄像头资源
cameras = null;
} finally {
if (isRear) {
initParm();
startFaceDetection();
}
}
}
return isRear;
}
// ////////////////////////////////////////////////////////////////////////////////
/*
* (non-Javadoc)
*
* @see
* com.wistron.WiCamera.Inter#onSurfaceTextureAvailable(android.graphics
* .SurfaceTexture, int, int)
*/
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
int height) {
mSurfaceTexture = surface;
surfaceCreated();
surfaceChanged();
try {
if (cameras != null) {
// List<Size> lst = cameras.getParameters()
// .getSupportedPreviewSizes();
// for (int i = 0; i < lst.size(); i++) {
// System.out.println("w=" + lst.get(i).width + "h="
// + lst.get(i).height);
// }
Camera.Size size = cameras.getParameters().getPreviewSize();
mTextureView.setInputFormat(size.width, size.height,
Image3D.LAYOUT_2D, 1.0, false, true,
Image3D.QUALITY_FASTEST);
cameras.setPreviewTexture(surface);
cameras.startPreview();
}
} catch (IOException ioe) {
// Something bad happened
}
}
// @Override
// protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
// {
// //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// double aspect = (this.mImage == null) ? 1.0D :
// this.mImage.getPixelAspectRatio();
// int width = getDefaultSize((int)(this.mVideoWidth * aspect),
// widthMeasureSpec);
// int height = getDefaultSize(this.mVideoHeight, heightMeasureSpec);
// if ((this.mVideoWidth > 0) && (this.mVideoHeight > 0)) {
// if (this.mVideoWidth * aspect * height > width * this.mVideoHeight)
// {
// height = (int)(width * this.mVideoHeight / (this.mVideoWidth * aspect));
// } else if (this.mVideoWidth * aspect * height < width *
// this.mVideoHeight)
// {
// width = (int)(height * this.mVideoWidth * aspect / this.mVideoHeight);
// }
//
// }
// setMeasuredDimension(width, height);
// }
/*
* (non-Javadoc)
*
* @see
* com.wistron.WiCamera.Inter#onSurfaceTextureSizeChanged(android.graphics
* .SurfaceTexture, int, int)
*/
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,
int height) {
Log.e("VideoSurfaceView", "onSurfaceTextureSizeChanged");
boolean newSurface = surface != mSurfaceTexture;
try {
if (cameras != null) {
if (newSurface) {
mSurfaceTexture.release();
mSurfaceTexture = surface;
cameras.stopPreview();
Camera.Size size = cameras.getParameters().getPreviewSize();
mTextureView.setInputFormat(size.width, size.height,
Image3D.LAYOUT_2D, 1.0, false, true,
Image3D.QUALITY_FASTEST);
Log.e("onSurfaceTextureSizeChanged", "size" + size.width
+ size.height);
cameras.setPreviewTexture(mSurfaceTexture);
cameras.startPreview();
// 判定为进入全景拍摄
if (size.width == 640 && size.height == 480) {
//
}
// WiCameraActivity.isClickable=true;
// Log.e("onSurfaceTextureSizeChanged", "按钮置为可用了");
WiCameraActivity.mMainHandler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < WiCameraActivity.m_camera_overlayui_array.length; i++) {
if (WiCameraActivity.m_camera_overlayui_array[i] != null
&& i != 0) {
WiCameraActivity.m_camera_overlayui_array[i]
.setClickable(true);
WiCameraActivity.m_camera_overlayui_array[i]
.setEnabled(true);
WiCameraActivity.m_camera_overlayui_array[i]
.setFocusable(true);
}
}
if (WiCameraActivity.m_camera_overlayui_array != null) {
System.out.println("全景退出 ......"
+ WiCameraActivity.isPanoramaMode);
if (WiCameraActivity.isPanoramaMode) {
WiCameraActivity.m_camera_overlayui_array[10]
.setEnabled(false);
WiCameraActivity.m_camera_overlayui_array[10]
.setClickable(false);
WiCameraActivity.m_camera_overlayui_array[10]
.setFocusable(false);
} else {
WiCameraActivity.m_camera_overlayui_array[10]
.setEnabled(true);
WiCameraActivity.m_camera_overlayui_array[10]
.setClickable(true);
WiCameraActivity.m_camera_overlayui_array[10]
.setFocusable(true);
}
}
Log.e("onSurfaceTextureSizeChanged", "按钮置为可用了");
}
}, 1000);
// WiCameraActivity.mMainHandler.post();
// for(int
// i=0;i<WiCameraActivity.m_camera_overlayui_array.length;i++)
// {
// if(WiCameraActivity.m_camera_overlayui_array[i]!=null)
// {
// WiCameraActivity.m_camera_overlayui_array[i].setClickable(true);
// WiCameraActivity.m_camera_overlayui_array[i].setEnabled(true);
// }
// }
} else {
WiCameraActivity.mMainHandler.postDelayed(new Runnable() {
@Override
public void run() {
WiCameraActivity.isCameraOpen = true;
for (int i = 0; i < WiCameraActivity.m_camera_overlayui_array.length; i++) {
if (Util.CAMERA_STATE == CAMERA_VIDEO) {
if (i != 13 && i != 14 && i != 10) {
WiCameraActivity.m_camera_overlayui_array[i]
.setEnabled(true);
WiCameraActivity.m_camera_overlayui_array[i]
.setClickable(true);
WiCameraActivity.m_camera_overlayui_array[i]
.setEnabled(true);
}
} else {
WiCameraActivity.m_camera_overlayui_array[i]
.setEnabled(true);
WiCameraActivity.m_camera_overlayui_array[i]
.setClickable(true);
WiCameraActivity.m_camera_overlayui_array[i]
.setEnabled(true);
}
}
// 3D模式
if (CSStaticData.g_is_3D_mode) {
WiCameraActivity.m_camera_overlayui_array[12]
.setEnabled(false);
WiCameraActivity.m_camera_overlayui_array[12]
.setClickable(false);
WiCameraActivity.m_camera_overlayui_array[12]
.setFocusable(false);
WiCameraActivity.m_camera_overlayui_array[13]
.setEnabled(false);
WiCameraActivity.m_camera_overlayui_array[13]
.setClickable(false);
WiCameraActivity.m_camera_overlayui_array[13]
.setFocusable(false);
}
// 全景
if (WiCameraActivity.m_camera_overlayui_array != null) {
if (WiCameraActivity.isPanoramaMode) {
WiCameraActivity.m_camera_overlayui_array[10]
.setEnabled(false);
WiCameraActivity.m_camera_overlayui_array[10]
.setClickable(false);
WiCameraActivity.m_camera_overlayui_array[10]
.setFocusable(false);
} else {
WiCameraActivity.m_camera_overlayui_array[10]
.setEnabled(true);
WiCameraActivity.m_camera_overlayui_array[10]
.setClickable(true);
WiCameraActivity.m_camera_overlayui_array[10]
.setFocusable(true);
}
}
// 前置摄像头
if (!WiCameraActivity.isRear) {
WiCameraActivity.m_camera_overlayui_array[10]
.setEnabled(false);
WiCameraActivity.m_camera_overlayui_array[13]
.setClickable(false);
WiCameraActivity.m_camera_overlayui_array[10]
.setFocusable(false);
WiCameraActivity.m_camera_overlayui_array[10]
.setClickable(false);
WiCameraActivity.m_camera_overlayui_array[13]
.setFocusable(false);
WiCameraActivity.m_camera_overlayui_array[13]
.setClickable(false);
}
}
}, 1000);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
postInvalidate();
// Ignored, Camera does all the work for us
System.out.println("onSurfaceTextureSizeChanged.....");
}
/*
* (non-Javadoc)
*
* @see
* com.wistron.WiCamera.Inter#onSurfaceTextureDestroyed(android.graphics
* .SurfaceTexture)
*/
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
surfaceDestroyed();
return true;
}
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#onSurfaceTextureUpdated(android.graphics.
* SurfaceTexture)
*/
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
// Invoked every time there's a new Camera preview frame
// System.out.println("onSurfaceTextureUpdated");
}
// ////////////////////////////////////////////////////////////////////////////
/*
* (non-Javadoc)
*
* 打开camera
*/
public void surfaceCreated() {
System.out.println("回来了。。。。。。。glsur");
// if (!m_isPreview) {
CameraInfo info = new CameraInfo();
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, info);
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) // 前置摄像头
m_camera_front = i;
else if (info.facing == CameraInfo.CAMERA_FACING_BACK)
m_camera_back = i;
}
// }
m_cameraIndex = m_camera_back;
boolean isrears = WiCameraActivity.isRear;
if (isrears) {
// switchCamera();
m_cameraIndex = m_camera_back;
} else {
m_cameraIndex = m_camera_front;
}
try {
cameras = Camera.open(m_cameraIndex); // 获取摄像头对象
// 设定照相类型
// cameras.setPreviewDisplay(holder);
camera_parameters = cameras.getParameters();
int maxfacenum = camera_parameters.getMaxNumDetectedFaces();
isFacedetectSupported = maxfacenum > 0 ? true : false;
// setFocusMode(1);
updateCameraParametersInitialize();
// setPictureSize();
// setPreviewSize();
// cameras.setPreviewDisplay(holder);
// startPreview();
// initParm();
m_isPreview = true;
setDisplayOrientation();
} catch (Exception e) {
// e.printStackTrace();
releaseCamera();
}
}
// public void setOrientation() {
// Util.setRotationParameter(camera_parameters, m_cameraIndex,
// WiCameraActivity.mOrientation);
// // System.out.println("拍照时的mOrientation="
// // + WiCameraActivity.mOrientation + "m_cameraIndex="
// // + m_cameraIndex);
// cameras.setParameters(camera_parameters);
// }
/*
* (non-Javadoc) 人脸识别
*
* @see
* com.wistron.WiCamera.Inter#onFaceDetection(android.hardware.Camera.Face
* [], android.hardware.Camera)
*/
@Override
public void onFaceDetection(android.hardware.Camera.Face[] faces,
Camera camera) {
boolean isfacedet = StoredData.getBoolean(StoredData.M_FACETRACKING,
false);
// System.out.println("是否可以人脸识别:" + isfacedet);
if (!isfacedet
|| (m_cameraIndex == m_camera_front
|| Util.CAMERA_STATE == CAMERA_VIDEO
|| WiCameraActivity.isContinus || (!WiCameraActivity.isCameraOpen))) {
WiCameraActivity.m_fd_face.setVisibility(View.GONE);
return;
}
if (m_isfacedetection) {
WiCameraActivity.m_fd_face.setVisibility(View.VISIBLE);
// if (FOCU_STATE == STATE_FOCUSING) {
// WiCameraActivity.m_fd_face.setVisibility(View.GONE);
// return;
// }
// TODO Auto-generated method stub
// TODO Auto-generated method stub
Rect[] rectarrayRects = new Rect[faces.length];
for (int i = 0; i < faces.length; i++) {
rectarrayRects[i] = faces[i].rect;
}
// TODO Auto-generated method stub
boolean isneedfocus = isNeedFocus(oldRect, rectarrayRects);
WiCameraActivity.m_fd_face.setFaces(faces);
if (isneedfocus) {
if ((mFocusArea != null)
&& (FOCU_STATE == STATE_SUCCESS || FOCU_STATE == STATE_FAIL)) {
mFocusArea = null;
mMeteringArea = null;
cameras.cancelAutoFocus();
FOCU_STATE = STATE_IDLE;
}
mFocusArea = new ArrayList<Camera.Area>();
mMeteringArea = new ArrayList<Camera.Area>();
if (cameras != null) {
for (int i = 0; i < faces.length; i++) {
mFocusArea.add(new Area(faces[i].rect, 100));
mMeteringArea.add(new Area(faces[i].rect, 100));
}
}
// FOCU_STATE = STATE_FOCUSING;
setArea();
}
oldRect = rectarrayRects;
}
}
/*
* (non-Javadoc) 计算是否需要人脸识别后对焦
*
* @see com.wistron.WiCamera.Inter#isNeedFocus(android.graphics.Rect[],
* android.graphics.Rect[])
*/
@Override
public boolean isNeedFocus(Rect[] oldRect, Rect[] newRect) {
// System.out.println("newrect.length=" + newRect.length);
if (newRect.length <= 0) {
return false;
}
if (Math.abs(oldRect.length - newRect.length) > 0) {
return true;
}
int oldx = 0, oldy = 0;
int newx = 0, newy = 0;
int diffx = 0, diffy = 0;
for (int i = 0; i < oldRect.length; i++) {
oldx += oldRect[i].centerX();
oldy += oldRect[i].centerY();
}
for (int i = 0; i < newRect.length; i++) {
newx += newRect[i].centerX();
newy += newRect[i].centerY();
}
diffx = Math.abs(newx - oldx);
diffy = Math.abs(newy - oldy);
if (diffx >= 105 || diffy >= 105) {
return true;
}
return false;
}
/*
* (non-Javadoc)
*
* 设置camera的旋转方向
*/
@Override
public void setDisplayOrientation() {
int mDisplayRotation = Util.getDisplayRotation((Activity) m_context);
int mDisplayOrientation = Util.getDisplayOrientation(mDisplayRotation,
CameraInfo.CAMERA_FACING_BACK);
cameras.setDisplayOrientation(mDisplayOrientation);
if (WiCameraActivity.m_fd_face != null) {
WiCameraActivity.m_fd_face
.setDisplayOrientation(mDisplayOrientation);
}
}
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#setOrientationIndicator(int)
*/
@Override
public void setOrientationIndicator(int degree) {
if (WiCameraActivity.m_fd_face != null)
WiCameraActivity.m_fd_face.setOrientation(degree);
}
/*
* (non-Javadoc)
*
* camera打开后设置camera参数
*/
@Override
public void surfaceChanged() {
try {
if (cameras != null) {
if (m_cameraIndex == m_camera_back) {
initParm();
startFaceDetection();
} else {
setPreviewSize(800, 480);
}
// String iso = camera_parameters.get("iso-mode-values");
String iso = camera_parameters.get("iso-values");
// System.out
// .println("iso=================================" + iso);
// 支持的照相预览的大小
List<Size> listSizes = cameras.getParameters()
.getSupportedPictureSizes();
// for (int i = 0; i < listSizes.size(); i++) {
// System.out.println("支持的照相照片的大小:w=" + listSizes.get(i).width
// + "h=" + listSizes.get(i).height);
//
// }
int exposure_Level = (int) (CAMERA_EXPOSURE_ALL[5] / camera_parameters
.getExposureCompensationStep());
// 支持的录像大小
List<Size> videosizes = cameras.getParameters()
.getSupportedVideoSizes();
for (int i = 0; i < videosizes.size(); i++) {
// System.out.println("支持的录像大小:w=" + videosizes.get(i).width
// + "h=" + videosizes.get(i).height);
}
cameras.setParameters(camera_parameters);
}
} catch (Exception e) {
// TODO: handle exception
}
if (WiCameraActivity.isPanoramaMode) {
WiCameraActivity.m_main_handle.sendEmptyMessage(500);
}
// isSingleMode(false);
}
/*
* (non-Javadoc) surface销毁后释放照相头资源
*
* @see com.wistron.WiCamera.Inter#surfaceDestroyed()
*/
@Override
public void surfaceDestroyed() {
// 当Surface被销毁的时候,该方法被调用
FOCU_STATE = STATE_IDLE;
// isSingleMode(true);
// 在这里需要释放Camera资源
// if (cameras != null) {
// if (isFacedetectSupported) {
// // cameras.setFaceDetectionListener(null);
// // cameras.stopFaceDetection();
// }
// m_isPreview = false;
// cameras.setPreviewCallback(null);
// cameras.stopPreview();
// cameras.release();
// cameras = null;
// }
stopPreview();
releaseCamera();
}
/*
* (non-Javadoc) 设定焦距值,进行预览的放大和缩小
*
* @see com.wistron.WiCamera.Inter#setZoomSize(int)
*/
@Override
public void setZoomSize(int value) {
if (cameras != null) {
try {
camera_parameters.setZoom(value);
cameras.setParameters(camera_parameters);
} catch (Exception e) {
// TODO: handle exception
}
}
}
/*
* (non-Javadoc) 设置iso
*
* @see com.wistron.WiCamera.Inter#setISO()
*/
@Override
public void setISO() {
if (cameras != null) {
try {
int iso = StoredData.getInt(StoredData.M_ISO, 0);
camera_parameters.set("iso", CAMERA_ISO_ARRAY[iso]);
cameras.setParameters(camera_parameters);
} catch (Exception e) {
// TODO: handle exception
System.out.println("此iso不支持");
}
Parameters p = cameras.getParameters();
System.out.println("设置iso=============" + p.get("iso"));
}
}
/*
* (non-Javadoc) 设置图片大小
*
* @see com.wistron.WiCamera.Inter#setPictureSize()
*/
@Override
public void setPictureSize() {
try {
int picsize = StoredData.getInt(StoredData.M_PICTURESIZE, 2);
camera_parameters.setPictureSize(CAMERA_PICSIZE[picsize][0],
CAMERA_PICSIZE[picsize][1]);
cameras.setParameters(camera_parameters);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("这种照片大小不支持");
}
}
/*
* (non-Javadoc) 设置预览大小
*
* @see com.wistron.WiCamera.Inter#setPreviewSize(int, int)
*/
@Override
public void setPreviewSize(int width, int height) {
try {
if (cameras != null) {
camera_parameters.setPreviewSize(width, height);
cameras.setParameters(camera_parameters);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#getHorizontalViewAngle()
*/
@Override
public float getHorizontalViewAngle() {
float angle = 0;
try {
if (cameras != null) {
Parameters temParameters = cameras.getParameters();
angle = temParameters.getHorizontalViewAngle();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return angle;
}
/*
* (non-Javadoc) 根据图片大小设置预览大小
*
* @see com.wistron.WiCamera.Inter#setPreviewSize()
*/
@Override
public void setPreviewSize() {
try {
if (cameras != null) {
// camera_parameters
// .setPreviewSize(WiCameraActivity.screenWidth
// + WiCameraActivity.sbarh,
// WiCameraActivity.screenHeight);
List<Size> sizes = camera_parameters.getSupportedPreviewSizes();
int picsize = StoredData.getInt(StoredData.M_PICTURESIZE, 0);
Size optimalSize = Util.getOptimalPreviewSize(
(Activity) m_context, sizes,
(double) CAMERA_PICSIZE[picsize][0]
/ CAMERA_PICSIZE[picsize][1]);
Size original = camera_parameters.getPreviewSize();
if (!original.equals(optimalSize)) {
System.out.println("预览大小:宽=" + optimalSize.width + "高="
+ optimalSize.height);
camera_parameters.setPreviewSize(optimalSize.width,
optimalSize.height);
cameras.setParameters(camera_parameters);
}
cameras.setParameters(camera_parameters);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* (non-Javadoc) 开始预览
*
* @see com.wistron.WiCamera.Inter#startPreview()
*/
@Override
public void startPreview() {
// 先使camera处于停止预览状态
if (m_isPreview) {
stopPreview();
}
// 开始预览
if (cameras != null) {
cameras.startPreview();
} else {
if (CSStaticData.DEBUG) {
Log.e("Cocoonshu", "[startPreview]cameras为空");
}
}
m_isPreview = true;
}
/*
* (non-Javadoc) 停止预览
*
* @see com.wistron.WiCamera.Inter#stopPreview()
*/
@Override
public void stopPreview() {
// 如果正在预览,就停止预览
if (m_isPreview == true) {
if (cameras != null) {
cameras.stopPreview();
m_isPreview = false;
FOCU_STATE = STATE_IDLE;
}
}
}
/*
* (non-Javadoc) 设置场景模式
*
* @see com.wistron.WiCamera.Inter#setSceneMode()
*/
@Override
public void setSceneMode() {
try {
int sceneMode = StoredData.getInt(StoredData.M_SCENEMODE, 0);
boolean issupportedscene = isSupported(
CAMERA_SCENEMODE_ARRAY[sceneMode],
camera_parameters.getSupportedSceneModes());
if (issupportedscene) {
camera_parameters
.setSceneMode(CAMERA_SCENEMODE_ARRAY[sceneMode]);
cameras.setParameters(camera_parameters);
} else {
System.out.println("不支持这种scenemode");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* (non-Javadoc) 设置图片的旋转角度
*
* @see com.wistron.WiCamera.Inter#setRotationParm()
*/
@Override
public void setRotationParm() {
try {
Parameters p = cameras.getParameters();
Util.setRotationParameter(p, m_cameraIndex,
WiCameraActivity.mOrientation);
System.out.println("拍照时的mOrientation="
+ WiCameraActivity.mOrientation + "m_cameraIndex="
+ m_cameraIndex);
cameras.setParameters(p);
} catch (Exception e) {
// TODO: handle exception
System.out.println("设定角度失败");
}
}
/*
* (non-Javadoc) 按下capture按钮后单拍
*
* @see com.wistron.WiCamera.Inter#setSelfTime()
*/
@Override
public void setSelfTime() {
int time = StoredData.getInt(StoredData.M_SELFTIMER, 0);
if (time == 0) {
Util.CAMERA_STATE = CAMERA_SINGLE_SHOT;
StoredData.saveInt(StoredData.M_CAMERA_STATE, CAMERA_SINGLE_SHOT);
if (cameras != null) {
// try {
// Util.setRotationParameter(camera_parameters, m_cameraIndex,
// WiCameraActivity.mOrientation);
// // System.out.println("拍照时的mOrientation="
// // + WiCameraActivity.mOrientation + "m_cameraIndex="
// // + m_cameraIndex);
// cameras.setParameters(camera_parameters);
// } catch (Exception e) {
// // TODO: handle exception
// System.out.println("设定角度失败");
// }
setRotationParm();
}
isToFocusToCapture = true;
if (FOCU_STATE == STATE_FOCUSING) {
FOCU_STATE = STATE_FOCUSING_SNAP_ON_FINISH;
} else {
if (cameras != null) {
// cameras.takePicture(null, null, null,
// VideoSurfaceView.this);
// isToFocusToCapture = true;
cameras.cancelAutoFocus();
try {
cameras.autoFocus(myAutoFocusCallback);
} catch (Exception e) {
// TODO: handle exception
WiCameraActivity.m_main_handle.removeMessages(3);
WiCameraActivity.m_main_handle.sendEmptyMessage(3);
cameras.cancelAutoFocus();
}
LayoutParams lp = (LayoutParams) camera_focusImageView
.getLayoutParams();
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
camera_focusImageView.setLayoutParams(lp);
camera_focusImageView.setVisibility(View.VISIBLE);
}
}
} else {
handler.sendEmptyMessageDelayed(CAMERA_SELFTIME, 0);
// if (cameras != null) {
// cameras.takePicture(null, null, null, VideoSurfaceView.this);
// }
}
}
/*
* (non-Javadoc) 单拍
*
* @see com.wistron.WiCamera.Inter#setSelfTimes()
*/
@Override
public void setSelfTimes() {
int time = StoredData.getInt(StoredData.M_SELFTIMER, 0);
// if (time == 0) {
Util.CAMERA_STATE = CAMERA_SINGLE_SHOT;
StoredData.saveInt(StoredData.M_CAMERA_STATE, CAMERA_SINGLE_SHOT);
if (cameras != null) {
// try {
// Util.setRotationParameter(camera_parameters, m_cameraIndex,
// WiCameraActivity.mOrientation);
// // System.out.println("拍照时的mOrientation="
// // + WiCameraActivity.mOrientation + "m_cameraIndex="
// // + m_cameraIndex);
// cameras.setParameters(camera_parameters);
// } catch (Exception e) {
// // TODO: handle exception
// System.out.println("设定角度失败");
// }
setRotationParm();
}
// if (FOCU_STATE == STATE_FOCUSING) {
// FOCU_STATE = STATE_FOCUSING_SNAP_ON_FINISH;
// } else {
if (cameras != null) {
cameras.takePicture(null, null, null, VideoSurfaceView.this);
}
}
// } else {
// handler.sendEmptyMessageDelayed(CAMERA_SELFTIME, 0);
// // if (cameras != null) {
// // cameras.takePicture(null, null, null, VideoSurfaceView.this);
// // }
// }
// }
/*
* (non-Javadoc) 设置闪光灯
*
* @see com.wistron.WiCamera.Inter#setFlashMode(int)
*/
@Override
public void setFlashMode(int flashmode) {
try {
if (cameras != null) {
// int flashMode = StoredData.getInt(StoredData.M_FLASHMODE, 2);
// boolean isflashmodesupported = isSupported(
// CAMERA_FLASHARRAY[flashMode],
// camera_parameters.getSupportedFlashModes());
// if (isflashmodesupported) {
camera_parameters.setFlashMode(CAMERA_FLASHARRAY[flashmode]);
cameras.setParameters(camera_parameters);
// } else {
// }
// System.out.println("flashMode=" + flashMode);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("这种flashmode不支持");
e.printStackTrace();
}
}
/*
* (non-Javadoc) 设置白平衡
*
* @see com.wistron.WiCamera.Inter#setWhiteBalanceMode()
*/
@Override
public void setWhiteBalanceMode() {
if (cameras != null) {
cameras.stopPreview();
try {
int whiteBalanceMode = StoredData.getInt(
StoredData.M_WHITEBALANCE, 0);
boolean isflahsmodesupported = isSupported(
CAMERA_WHITEBALANCE_ARRAY[whiteBalanceMode],
camera_parameters.getSupportedWhiteBalance());
if (isflahsmodesupported) {
camera_parameters
.setWhiteBalance(CAMERA_WHITEBALANCE_ARRAY[whiteBalanceMode]);
cameras.setParameters(camera_parameters);
} else {
System.out.println("这种白平衡不支持");
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
cameras.startPreview();
}
}
/*
* (non-Javadoc) 恢复默认
*
* @see com.wistron.WiCamera.Inter#restoreDefault()
*/
@Override
public void restoreDefault() {
if (cameras != null) {
StoredData.saveInt(StoredData.M_SCENEMODE, 0);
StoredData.saveInt(StoredData.M_FLASHMODE, 0);
StoredData.saveInt(StoredData.M_WHITEBALANCE, 0);
StoredData.saveInt(StoredData.M_EXPOSURE, 4);
StoredData.saveInt(StoredData.M_PICTURESIZE, 2);
// StoredData.saveInt(StoredData.M_SELFTIMER, 0);
StoredData.saveBoolean(StoredData.M_SOUNDMODE, true);
StoredData.saveBoolean(StoredData.M_SMILESHOT, false);
StoredData.saveBoolean(StoredData.m_GSENSOR, true);
StoredData.saveBoolean(StoredData.M_HJR, true);
StoredData.saveBoolean(StoredData.M_TOUCHFOCUS, true);
StoredData.saveBoolean(StoredData.M_GRIDDISINFINDER, false);
// StoredData.saveBoolean(StoredData.M_REDEYEREMOVAL, false);
StoredData.saveBoolean(StoredData.M_REVIEW, true);
boolean isExt = OperationFile.isExtSdcardExists();
boolean isInt = OperationFile.isIntSdcardExists();
if (isExt && isInt) {
int storageMode = StoredData
.getInt(StoredData.M_STORAGEMODE, 0);
StoredData.saveInt(StoredData.M_STORAGEMODE, 0);
} else {
if (isInt) {
StoredData.saveInt(StoredData.M_STORAGEMODE, 0);
}
if (isExt) {
StoredData.saveInt(StoredData.M_STORAGEMODE, 1);
}
}
// StoredData.saveInt(StoredData.M_STORAGEMODE, 0);
StoredData.saveInt(StoredData.M_CONTINUESHOTNUM, 0);
StoredData.saveInt(StoredData.M_VIDEORESOLUTION, 1);
StoredData.saveInt(StoredData.M_CONTINUESHOTNUM, 0);
StoredData.saveBoolean(StoredData.M_FACETRACKING, false);
StoredData.saveBoolean(StoredData.M_ADDTAG, true);
StoredData.saveInt(StoredData.M_ISO, 0);
try {
camera_parameters.setSceneMode(CAMERA_SCENEMODE_ARRAY[0]);
camera_parameters.setFlashMode(CAMERA_FLASHARRAY[2]);
camera_parameters.setWhiteBalance(CAMERA_WHITEBALANCE_ARRAY[0]);
camera_parameters
.setExposureCompensation((int) (CAMERA_EXPOSURE_ALL[4] / camera_parameters
.getExposureCompensationStep()));
camera_parameters.setPictureSize(CAMERA_PICSIZE[2][0],
CAMERA_PICSIZE[2][1]);
cameras.setParameters(camera_parameters);
} catch (Exception e) {
// TODO: handle exception
System.out.println("恢复默认出错");
} finally {
// cameras.setParameters(camera_parameters);
}
}
}
/*
* (non-Javadoc) 设置曝光度
*
* @see com.wistron.WiCamera.Inter#setExposure()
*/
@Override
public void setExposure() {
try {
if (cameras != null && camera_parameters != null) {
int exposure_Level = StoredData
.getInt(StoredData.M_EXPOSURE, 4);
camera_parameters
.setExposureCompensation((int) (CAMERA_EXPOSURE_ALL[exposure_Level] / camera_parameters
.getExposureCompensationStep()));
cameras.setParameters(camera_parameters);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("不支持此曝光度");
}
}
/*
* (non-Javadoc) 播放声音
*
* @see com.wistron.WiCamera.Inter#PlaySounds(int)
*/
@Override
public void PlaySounds(int a) {
boolean isplaysound = StoredData.getBoolean(StoredData.M_SOUNDMODE,
true);
if (isplaysound) {
// isMute(false);
if (a == 0) {
playSound(R.raw.camera_click);
} else {
playSound(R.raw.camera_focus);
}
} else {
// isMute(true);
}
}
/*
* (non-Javadoc) 释放Mediaplayer
*
* @see com.wistron.WiCamera.Inter#releaseMediaplayer()
*/
@Override
public void releaseMediaplayer() {
// TODO Auto-generated method stub
if (soundPlayer != null) {
soundPlayer.release();
}
}
/*
* (non-Javadoc) 根据声音id播放声音
*
* @see com.wistron.WiCamera.Inter#playSound(int)
*/
@Override
public void playSound(int id) {
boolean isplaysound = StoredData.getBoolean(StoredData.M_SOUNDMODE,
true);
if (isplaysound) {
// TODO Auto-generated method stub
int num = StoredData.getInt(StoredData.M_CONTINUESHOTNUM, 0);
soundPlayer = new SoundPlayer(getResources().openRawResourceFd(id),
false, CAMERA_CONTINUESHOTNUMARRAY[num]);
soundPlayer.play();
}
}
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#setSoundMode(int)
*/
@Override
public void setSoundMode(int id) {
// TODO Auto-generated method stub
// int sound = StoredData.getInt(StoredData.M_SOUNDMODE, 0);
AudioManager meng = (AudioManager) getContext().getSystemService(
Context.AUDIO_SERVICE);
int voice = meng.getStreamVolume(AudioManager.STREAM_NOTIFICATION);
if (voice != 0) {
if (m_mediaplayer == null) {
m_mediaplayer = new MediaPlayer();
}
if (m_mediaplayer != null)
try {
m_mediaplayer.setDataSource(getResources()
.openRawResourceFd(id).getFileDescriptor());
m_mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
m_mediaplayer.setLooping(false);
m_mediaplayer.prepare();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
m_mediaplayer.start();
}
}
/*
* (non-Javadoc) 释放camera资源
*
* @see com.wistron.WiCamera.Inter#releaseCamera()
*/
@Override
public void releaseCamera() {
// TODO Auto-generated method stub
if (cameras != null) {
m_isPreview = false;
cameras.stopPreview();
cameras.cancelAutoFocus();
cameras.release();
cameras = null;
releaseMediaplayer();
}
}
/*
* (non-Javadoc) 开始人脸识别
*
* @see com.wistron.WiCamera.Inter#startFaceDetection()
*/
@Override
public void startFaceDetection() {
try {
if (cameras != null) {
if (isFacedetectSupported) {
if (m_cameraIndex == m_camera_back) {
cameras.setFaceDetectionListener(this);
camera_parameters.set("face-detection", "on");
cameras.startFaceDetection();
cameras.setParameters(camera_parameters);
}
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* (non-Javadoc) 停止人脸识别
*
* @see com.wistron.WiCamera.Inter#stopFaceDetection()
*/
@Override
public void stopFaceDetection() {
try {
if (cameras != null) {
if (isFacedetectSupported) {
if (m_cameraIndex == m_camera_back) {
camera_parameters.set("face-detection", "off");
cameras.setFaceDetectionListener(null);
cameras.stopFaceDetection();
cameras.setParameters(camera_parameters);
}
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#myTakePic()
*/
@Override
public void myTakePic() {
if (cameras != null) {
cameras.takePicture(null, null, null, VideoSurfaceView.this);
}
}
public final class ShutterCallback implements
android.hardware.Camera.ShutterCallback {
public void onShutter() {
}
}
public final class PostViewPictureCallback implements PictureCallback {
public void onPictureTaken(byte[] data, android.hardware.Camera camera) {
}
}
public final class RawPictureCallback implements PictureCallback {
public void onPictureTaken(byte[] rawData,
android.hardware.Camera camera) {
}
}
public byte[] singleData;
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#onPictureTaken(byte[],
* android.hardware.Camera)
*/
@Override
public void onPictureTaken(byte[] data, Camera cameras) {
// if (WiCameraActivity.mCurrentDegree == 90) {
// WiCameraActivity.isok = false;
// } else if (WiCameraActivity.mCurrentDegree == 360) {
// WiCameraActivity.isok = true;
// }
switch (Util.CAMERA_STATE) {
case CAMERA_SINGLE_SHOT:
case CAMERA_SELFTIME:
PlaySounds(0);
System.out.println("time3=........................."
+ new Date().getTime());
// 单拍
// storedImage(data, -1);
singleData = data;
// cameras.startPreview();
// PlaySounds();
// newpicsize = (Math.round((double) data.length / (1024 * 1024)) +
// "")
// .substring(0, 1);
// camera_spareSpace.setText(spareSpace + "/" + "" + newpicsize +
// "M");
handler.sendEmptyMessage(CAMERA_SINGLE_SHOT);
// 重新预览,开始人脸识别
// stopFaceDetection();
startPreview();
startFaceDetection();
break;
case CAMERA_CONTINUOUS:
case CAMERA_CONTINUOUSANDSELFTIME:
// if(!WiCameraActivity.isContinus){
// if (soundPlayer != null) {
// soundPlayer.release();
// }
// photonum = 0;
// handler.sendEmptyMessage(CAMERA_CONTINUOUS);
// // 重新预览,开始人脸识别
// startPreview();
// startFaceDetection();
// }
// if (WiCameraActivity.isToStopContinus) {
// soundPlayer.release();
// photonum = 0;
// handler.sendEmptyMessage(CAMERA_CONTINUOUS);
// // 重新预览,开始人脸识别
// startPreview();
// startFaceDetection();
// return;
// }
PlaySounds(0);
// newpicsize = (Math.round((double) data.length / (1024 * 1024)) +
// "")
// .substring(0, 1);
spareSpace = OperationFile.readSDCard();
camera_spareSpace.setText(spareSpace + "");
camera_spareSpace.postInvalidate();
// if(list.size()%5==0){
// new MyAsyncTask(data, photonum).execute();
// }
list.add(data);
// PlaySounds();
// cameras.startPreview();
++photonum;
System.out.println("photonum=========" + photonum);
// System.out.println("photonum=" + photonum);
int numindex = StoredData.getInt(StoredData.M_CONTINUESHOTNUM, 0);
int maxnum = CAMERA_CONTINUESHOTNUMARRAY[numindex];
if (photonum < maxnum) {
// System.out.println("photonum========="+photonum);
// playSound();
// myTakePic();
// 设置开始计时时间
int cameraSelfTimeId = StoredData.getInt(
StoredData.M_SELFTIMER, 0);
System.out.println("自定义上时间为。。。。。。。。。。。。。。。。。"
+ cameraSelfTimeId);
if (cameraSelfTimeId == 0) {
// myTakePic();
WiCameraActivity.m_main_handle.sendEmptyMessageDelayed(
20000, 800);
startPreview();
startFaceDetection();
} else {
WiCameraActivity.m_main_handle.sendEmptyMessageDelayed(
20000, 800);
// WiCameraActivity.m_main_handle.sendEmptyMessage(10000);
// myTakePic();
// 重新预览,开始人脸识别
// stopPreview();
startPreview();
startFaceDetection();
}
} else {
PlaySounds(0);
if (soundPlayer != null) {
soundPlayer.release();
}
photonum = 0;
handler.sendEmptyMessage(CAMERA_CONTINUOUS);
// 重新预览,开始人脸识别
startPreview();
startFaceDetection();
return;
}
break;
case CAMERA_FOCUAREA:
boolean isRecordTakePicSuport = cameras.getParameters()
.isVideoSnapshotSupported();
if (isRecordTakePicSuport) {
// cameras.takePicture(null, null, null, this);
}
break;
default:
break;
}
FOCU_STATE = STATE_IDLE;
}
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#setOrientationHint()
*/
@Override
public void setOrientationHint() {
// Util.setRotationParameter(camera_parameters, m_cameraIndex,
// WiCameraActivity.mOrientation);
// // System.out.println("拍照时的mOrientation="
// // + WiCameraActivity.mOrientation + "m_cameraIndex="
// // + m_cameraIndex);
// cameras.setParameters(camera_parameters);
if (cameras != null) {
int rotation = 0;
if (WiCameraActivity.mOrientation != OrientationEventListener.ORIENTATION_UNKNOWN) {
CameraInfo info = CameraHolder.instance().getCameraInfo()[m_cameraIndex];
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
rotation = (info.orientation
- WiCameraActivity.mOrientation + 360) % 360;
} else { // back-facing camera
rotation = (info.orientation + WiCameraActivity.mOrientation) % 360;
}
}
m_recorder.setOrientationHint(rotation);
}
}
/**
* 开始录制视频
*/
String videoTitle = null;
/*
* (non-Javadoc) 开始录制
*
* @see com.wistron.WiCamera.Inter#startRecord()
*/
@Override
public void startRecord() {
StoredData.saveInt(StoredData.M_CAMERA_STATE, CAMERA_VIDEO);
try {
Util.CAMERA_STATE = CAMERA_VIDEO;
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String dateparse = formatter.format(date);
int storepath = StoredData.getInt(StoredData.M_STORAGEMODE, 0);
// 视频文件的保存路径
M_VIDEOPATH = CAMERA_PAHTARRAY[storepath] + "video-" + dateparse
+ ".mp4";
videoTitle = "video-" + dateparse;
// 创建视频文件
m_videofile = new File(M_VIDEOPATH);
StoredData.saveString(StoredData.M_REVIEWFILEPATH, M_VIDEOPATH);
// 如果父目录不存在,就创建目录
if (!m_videofile.getParentFile().exists()) {
m_videofile.getParentFile().mkdirs();
}
VIDEO_FILE_LIST.add(M_VIDEOPATH);
setVideoPath(M_VIDEOPATH);
// 使camera先处于停止状态
stopRecord();
// 以下开始进入录制状态
m_isrecord = true;
cameras.unlock();
// 为了快速在预览和录制之间转换,故使用此函数
m_recorder.setCamera(cameras);
// 设置视频源为camera
m_recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// 设置音频源为mic
m_recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);// mic
// 设置输出文件的格式为mp4
m_recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);// mp4
// 声道
// m_recorder.setAudioChannels(1);
// 最长录制5000秒钟
// m_recorder.setMaxDuration(5000000);
// 最大录制500M
// m_recorder.setMaxFileSize(500000000);
// 2320k/s
m_recorder.setVideoEncodingBitRate(2920000);// 2920000
// m_recorder.setVideoFrameRate(25);//30
m_recorder.setAudioSamplingRate(8000);// 8000
m_recorder.setAudioEncodingBitRate(64000);// 12000
m_recorder.setVideoFrameRate(30);
// 设置音频编码
m_recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// aac
// 设置视频编码
m_recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);// h262
int videosizeindex = StoredData.getInt(
StoredData.M_VIDEORESOLUTION, 3);
int videosize[] = VIDEO_VIDEORESOLUTIONARRAY[videosizeindex];
// 设置录制视频的分辨率
m_recorder.setVideoSize(videosize[0], videosize[1]);// 352,288
// 输出文件的路径和名称
m_recorder.setOutputFile(m_videofile.getAbsolutePath());
m_recorder.setPreviewDisplay(mTextureView.getHolder().getSurface());
setOrientationHint();
// 准备,开始,视频录制
m_recorder.prepare();
m_recorder.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
m_isrecord = false;
}
}
/*
* (non-Javadoc) 停止录制
*
* @see com.wistron.WiCamera.Inter#stopRecord()
*/
@Override
public void stopRecord() {
try {
// 判断是否是录制状态
if (m_isrecord) {
boolean is3d = StoredData.getBoolean(StoredData.M_CAMERA3D,
false);
if (is3d) {
OperationFile
.intTodbv(m_context, "video/mp4-3d", videoTitle,
WiCameraActivity.mCurrentDegree,
m_videofile.getAbsolutePath(),
m_videofile.length());
} else {
OperationFile
.intTodbv(m_context, "video/mp4", videoTitle,
WiCameraActivity.mCurrentDegree,
m_videofile.getAbsolutePath(),
m_videofile.length());
}
// 通知数据层
if (WiGalleryOpenGLRenderer.mAsyncFileProvider != null) {
WiGalleryOpenGLRenderer.mAsyncFileProvider
.addNewFile(M_VIDEOPATH);
}
// 以下停止录制状态,设置状态为false和状态标志为绿色
m_isrecord = false;
// 设置m_recorder为空的状态,为下次录制做准备
m_recorder.reset();
// 锁定照相头
cameras.lock();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
// try {
// Thread.sleep(1000);
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
/**
* 保存连拍的照片
*
* @param data
* 连拍照片的数据
* @param photonum
* 第几张连拍的照片
* @return 是否保存成功
*/
File picture = null;
String title = null;
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#storedImage(byte[], int)
*/
@Override
public void storedImage(final byte[] data, final int photonum) {
saveImage(data, photonum);
}
/*
* (non-Javadoc) 计算对焦区域
*
* @see com.wistron.WiCamera.Inter#setArea()
*/
@Override
public void setArea() {
if (cameras != null) {
try {
if (FOCU_STATE == STATE_FOCUSING) {
return;
}
boolean mLockAeAwbNeeded = (camera_parameters
.isAutoExposureLockSupported() || camera_parameters
.isAutoWhiteBalanceLockSupported());
if (mLockAeAwbNeeded) {
camera_parameters.setAutoExposureLock(false);
camera_parameters.setAutoWhiteBalanceLock(false);
}
boolean mfocusareasupported = camera_parameters
.getMaxNumFocusAreas() > 0
&& isSupported(Parameters.FOCUS_MODE_AUTO,
camera_parameters.getSupportedFocusModes());
boolean ismeteringareassupported = camera_parameters
.getMaxNumMeteringAreas() > 0;
if (mfocusareasupported) {
camera_parameters.setFocusAreas(mFocusArea);
}
if (ismeteringareassupported) {
camera_parameters.setMeteringAreas(mMeteringArea);
}
// camera_parameters.setSceneMode(camera_parameters.SCENE_MODE_AUTO);
// camera_parameters
// .setWhiteBalance(camera_parameters.WHITE_BALANCE_AUTO);
camera_parameters.setJpegQuality(100);
camera_parameters
.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
cameras.setParameters(camera_parameters);
FOCU_STATE = STATE_FOCUSING;
cameras.autoFocus(myAutoFocusCallback);
System.out.println("自动对焦。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。");
} catch (Exception e) {
// TODO: handle exception
FOCU_STATE = STATE_FAIL;
// cameras.autoFocus(null);
cameras.cancelAutoFocus();
e.printStackTrace();
}
}
}
public static boolean isSupported(String value, List<String> supported) {
return supported == null ? false : supported.indexOf(value) >= 0;
}
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#updateCameraParametersInitialize()
*/
@Override
public void updateCameraParametersInitialize() {
try {
if (cameras != null) {
// Reset preview frame rate to the maximum because it may be
// lowered
// by
// video camera application.
List<Integer> frameRates = camera_parameters
.getSupportedPreviewFrameRates();
if (frameRates != null) {
Integer max = Collections.max(frameRates);
camera_parameters.setPreviewFrameRate(max);
}
camera_parameters.setRecordingHint(false);
// Disable video stabilization. Convenience methods not
// available in
// API
// level <= 14
String vstabSupported = camera_parameters
.get("video-stabilization-supported");
if ("true".equals(vstabSupported)) {
camera_parameters.set("video-stabilization", "false");
}
cameras.setParameters(camera_parameters);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("出错了");
}
}
/*
* (non-Javadoc) 触摸对焦的逻辑
*
* @see com.wistron.WiCamera.Inter#onTouchEvent(android.view.MotionEvent)
*/
@Override
public boolean onTouchEvent(MotionEvent e) {
// boolean isTouchFocus = StoredData.getBoolean(StoredData.M_TOUCHFOCUS,
// true);
// if (!isTouchFocus){
// return false;
// }
if (WiCameraActivity.isContinus || (!WiCameraActivity.isCameraOpen)) {
return false;
}
if (WiCameraActivity.isPanoramaMode) {
return false;
}
if (m_cameraIndex == m_camera_front) {
return false;
}
if (FOCU_STATE == STATE_FOCUSING_SNAP_ON_FINISH) {
return false;
}
if (cameras != null && Util.CAMERA_STATE != CAMERA_VIDEO) {
// TODO Auto-generated method stub
// if ((FOCU_STATE == STATE_FOCUSING)) {
// return false;
// }
if ((mFocusArea != null)
&& (FOCU_STATE == STATE_SUCCESS || FOCU_STATE == STATE_FAIL || FOCU_STATE == STATE_FOCUSING)) {
mFocusArea.clear();
mMeteringArea.clear();
mFocusArea = null;
mMeteringArea = null;
cameras.cancelAutoFocus();
handler.removeMessages(CAMERA_FOCUAREA);
camera_focusImageView.setVisibility(View.GONE);
FOCU_STATE = STATE_IDLE;
}
// FOCU_STATE = STATE_FOCUSING;
// Util.setRotationParameter(camera_parameters, 0,
// WiCameraActivity.mOrientation);
// cameras.setParameters(camera_parameters);
Matrix matrix = new Matrix();
Util.prepareMatrix(
matrix,
false,
Util.getDisplayOrientation(
Util.getDisplayRotation((Activity) m_context), 0),
previewwidth, previewheight);
boolean b = matrix.invert(mMatrix);
camera_parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
try {
cameras.setParameters(camera_parameters);
} catch (Exception e2) {
// TODO: handle exception
}
cameras.cancelAutoFocus();
if (mFocusArea != null) {
mFocusArea.clear();
mMeteringArea.clear();
mFocusArea = null;
mMeteringArea = null;
}
float x = (float) e.getX();
float y = (float) e.getY();
boolean istouchfocus = StoredData.getBoolean(
StoredData.M_TOUCHFOCUS, true);
if (istouchfocus) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
stopFaceDetection();
}
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
System.out.println("x=" + x + "y=" + y);
picMove(x, y, camera_focusImageView, 200, 200,
previewwidth, previewheight);
handler.removeMessages(CAMERA_FOCUAREA);
handler.sendEmptyMessageDelayed(CAMERA_FOCUAREA, 3000);
// if ((FOCU_STATE == STATE_FOCUSING)) {
// cameras.cancelAutoFocus();
// FOCU_STATE = STATE_IDLE;
// }
break;
case MotionEvent.ACTION_UP:
// FOCU_STATE = STATE_FOCUSING;
if (mFocusArea == null) {
mFocusArea = new ArrayList<Camera.Area>();
mMeteringArea = new ArrayList<Camera.Area>();
mFocusArea.add(new Area(new Rect(), 1));
mMeteringArea.add(new Area(new Rect(), 1));
}
calculateTapArea(120, 120, 1, (int) x, (int) y,
previewwidth, previewheight, mFocusArea.get(0).rect);
calculateTapArea(120, 120, 1.5, (int) x, (int) y,
previewwidth, previewheight,
mMeteringArea.get(0).rect);
m_isfacedetection = false;
WiCameraActivity.m_fd_face.setVisibility(View.GONE);
setArea();
break;
default:
break;
}
} else {
camera_focusImageView.setVisibility(View.GONE);
}
}
return true;
}
/*
* (non-Javadoc) 计算对焦区域
*
* @see com.wistron.WiCamera.Inter#calculateTapArea(int, int, double, int,
* int, int, int, android.graphics.Rect)
*/
@Override
public Rect calculateTapArea(int focusWidth, int focusHeight,
double areaMultiple, int x, int y, int previewWidth,
int previewHeight, Rect rect) {
int areaWidth = (int) (focusWidth * areaMultiple);
int areaHeight = (int) (focusHeight * areaMultiple);
int left = Util.clamp(x - areaWidth / 2, 0, previewWidth - areaWidth);
int top = Util.clamp(y - areaHeight / 2, 0, previewHeight - areaHeight);
RectF rectF = new RectF(left, top, left + areaWidth, top + areaHeight);
mMatrix.mapRect(rectF);
Util.rectFToRect(rectF, rect);
return rect;
}
/* 移动图片的方法 */
/*
* (non-Javadoc)
*
* @see com.wistron.WiCamera.Inter#picMove(float, float,
* android.widget.ImageView, int, int, int, int)
*/
@Override
public void picMove(float x, float y, ImageView imageView, int intWidth,
int intHeight, int intScreenX, int intScreenY) {
imageView.setBackgroundResource(R.drawable.camera_focus);
imageView.setVisibility(View.VISIBLE);
float mX, mY;
/* 默认微调图片与指针的相对位置 */
mX = x - (intWidth / 2);
mY = y - (intHeight / 2);
/* 防图片超过屏幕的相关处理 */
/* 防止屏幕向右超过屏幕 */
if ((mX + intWidth) > intScreenX) {
mX = intScreenX - intWidth;
}
/* 防止屏幕向左超过屏幕 */
if (mX < 0) {
mX = 0;
}
/* 防止屏幕向下超过屏幕 */
if ((mY + intHeight) > intScreenY) {
mY = intScreenY - intHeight;
}
/* 防止屏幕向上超过屏幕 */
if (mY < 0) {
mY = 0;
}
/* 通过log 来查看图片位置 */
Log.i("jay", Float.toString(mX) + "," + Float.toString(mY));
/* 以setLayoutParams方法,重新安排Layout上的位置 */
// imageView.setLayoutParams(new AbsoluteLayout.LayoutParams(intWidth,
// intHeight, (int) mX, (int) mY));
LayoutParams p = (LayoutParams) imageView.getLayoutParams();
p.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
p.addRule(RelativeLayout.ALIGN_PARENT_TOP);
p.leftMargin = (int) mX;
p.topMargin = (int) mY;
p.width = intWidth;
p.height = intHeight;
imageView.setLayoutParams(p);
}
/*
* (non-Javadoc)
*
* @see
* com.wistron.WiCamera.Inter#setPreviewCallback(android.hardware.Camera
* .PreviewCallback)
*/
@Override
public void setPreviewCallback(PreviewCallback my) {
Log.e("test++++++++++++++", "setPreviewCallback");
if (cameras != null) {
cameras.setPreviewCallback(my);
}
}
/*
* (non-Javadoc) 保存图片
*
* @see com.wistron.WiCamera.Inter#saveImage(byte[], int)
*/
@Override
public int saveImage(final byte[] data, final int photonum) {
// data是一个原始的JPEG图像数据,
// 在这里我们可以存储图片,很显然可以采用MediaStore
// 注意保存图片后,再次调用startPreview()回到预览
boolean is3D = StoredData.getBoolean(StoredData.M_CAMERA3D, false);
if (is3D) {
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String dateString = formatter.format(date);
// File picture = null;
// String title = null;
int storepath = StoredData.getInt(StoredData.M_STORAGEMODE, 0);
if (photonum == -1) {
title = "photo-" + dateString;
picture = new File(CAMERA_PAHTARRAY[storepath] + "photo-"
+ dateString + ".jps");
} else {
title = dateString + "_" + (photonum + 1);
picture = new File(CAMERA_PAHTARRAY[storepath] + dateString
+ "_" + (photonum + 1) + ".jps");
continous_array.add(picture.getAbsolutePath());
System.out.println("path=" + picture.getAbsolutePath());
}
if (!picture.getParentFile().exists()) {
picture.getParentFile().mkdirs();
}
try {
DDD ddd = new DDD();
Options o = new Options();
o.inJustDecodeBounds = false;
o.inPreferredConfig = Config.RGB_565;
// o.inSampleSize=2;
Bitmap bit = BitmapFactory.decodeByteArray(data, 0,
data.length, o);
// Bitmap[] bits = ddd.genrenteTriDefSplitBitmap(OperateBitmaps
// .fitScreenSize(bit, WiCameraActivity.screenWidth,
// WiCameraActivity.screenHeight), true);
Bitmap[] bits = ddd.genrenteTriDefSplitBitmap(bit, true);
if (bit != null) {
bit.recycle();
}
Bitmap b = Bitmap.createBitmap(bits[0].getWidth() * 2,
bits[0].getHeight(), Config.RGB_565);
Canvas c = new Canvas(b);
c.drawBitmap(bits[0], 0, 0, null);
c.drawBitmap(bits[1], bits[0].getWidth(), 0, null);
bits[0].recycle();
bits[1].recycle();
CameraView.saveBitmap(b, picture.getAbsolutePath());
b.recycle();
OperationFile.intTodb(m_context, "image/jpeg", title,
WiCameraActivity.mCurrentDegree,
picture.getAbsolutePath(), data.length);
// 添加iso信息
// int isoId = StoredData.getInt(StoredData.M_ISO, 1);
// String isoValue = CAMERA_ISO_ARRAY[isoId];
// OperationFile.addImageISO(picture.getAbsolutePath(),
// isoValue);
// 添加gps信息
boolean isaddgps = StoredData.getBoolean(StoredData.M_ADDTAG,
true);
if (isaddgps) {
// if (GetGPSInfo.isGPSOpen()) {
if (m_getGpsInfo == null) {
m_getGpsInfo = new GetGPSInfo(m_context);
m_getGpsInfo.getGps();
}
m_location = m_getGpsInfo.m_locations;
System.out.println("location============================"
+ m_location);
OperationFile.addImageGps(m_location,
picture.getAbsolutePath());
}
// }
// 所有相片的路径
// if (PIC_FILE_LIST != null) {
// synchronized (PIC_FILE_LIST) {
PIC_FILE_LIST.add(picture.getAbsolutePath());
// }
// 通知数据层
if (WiGalleryOpenGLRenderer.mAsyncFileProvider != null) {
WiGalleryOpenGLRenderer.mAsyncFileProvider
.addNewFile(picture.getAbsolutePath());
}
System.out.println("pic array size=========="
+ PIC_FILE_LIST.size());
// }
int numindex = StoredData.getInt(StoredData.M_CONTINUESHOTNUM,
0);
int maxnum = CAMERA_CONTINUESHOTNUMARRAY[numindex];
if (((photonum + 1) == maxnum) || photonum == -1) {
CAMERA_CONTINUOUS_LASTPICPATH = picture.getPath();
StoredData.saveString(StoredData.M_REVIEWFILEPATH,
CAMERA_CONTINUOUS_LASTPICPATH);
}
return photonum;
} catch (Exception e) {
// TODO: handle exception
return -2;
}
} else {
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String dateString = formatter.format(date);
File picture = null;
String title = null;
int storepath = StoredData.getInt(StoredData.M_STORAGEMODE, 0);
if (photonum == -1) {
title = "photo-" + dateString;
// boolean is3D = StoredData.getBoolean(StoredData.M_CAMERA3D,
// false);
// String tag = ".jpg";
// if (is3D) {
// tag = ".jpg";
// } else {
// tag = ".jpg";
// }
picture = new File(CAMERA_PAHTARRAY[storepath] + "photo-"
+ dateString + ".jpg");
} else {
title = dateString + "_" + (photonum + 1);
picture = new File(CAMERA_PAHTARRAY[storepath] + dateString
+ "_" + (photonum + 1) + ".jpg");
continous_array.add(picture.getAbsolutePath());
System.out.println("path=" + picture.getAbsolutePath());
}
if (!picture.getParentFile().exists()) {
picture.getParentFile().mkdirs();
}
try {
// 获得文件输出流
FileOutputStream fos = new FileOutputStream(picture);
fos.write(data);
// 关闭文件流
fos.flush();
fos.close();
OperationFile.intTodb(m_context, "image/jpeg", title,
WiCameraActivity.mCurrentDegree,
picture.getAbsolutePath(), data.length);
// 添加iso信息
// int isoId = StoredData.getInt(StoredData.M_ISO, 1);
// String isoValue = CAMERA_ISO_ARRAY[isoId];
// OperationFile.addImageISO(picture.getAbsolutePath(),
// isoValue);
// 添加gps信息
boolean isaddgps = StoredData.getBoolean(StoredData.M_ADDTAG,
true);
if (isaddgps) {
// if (GetGPSInfo.isGPSOpen()) {
if (m_getGpsInfo == null) {
m_getGpsInfo = new GetGPSInfo(m_context);
m_getGpsInfo.getGps();
}
m_location = m_getGpsInfo.m_locations;
System.out.println("location============================"
+ m_location);
OperationFile.addImageGps(m_location,
picture.getAbsolutePath());
}
// }
// 所有相片的路径
// if (PIC_FILE_LIST != null) {
// synchronized (PIC_FILE_LIST) {
PIC_FILE_LIST.add(picture.getAbsolutePath());
// }
// 通知数据层
if (WiGalleryOpenGLRenderer.mAsyncFileProvider != null) {
WiGalleryOpenGLRenderer.mAsyncFileProvider
.addNewFile(picture.getAbsolutePath());
}
System.out.println("pic array size=========="
+ PIC_FILE_LIST.size());
// }
int numindex = StoredData.getInt(StoredData.M_CONTINUESHOTNUM,
0);
int maxnum = CAMERA_CONTINUESHOTNUMARRAY[numindex];
if (((photonum + 1) == maxnum) || photonum == -1) {
CAMERA_CONTINUOUS_LASTPICPATH = picture.getPath();
StoredData.saveString(StoredData.M_REVIEWFILEPATH,
CAMERA_CONTINUOUS_LASTPICPATH);
}
// Thread.sleep(300);
return photonum;
} catch (Exception e) {
// e.printStackTrace();
return -2;
}
}
}
// 异步保存图片
class MyAsyncTask extends AsyncTask<Void, Void, Void> {
byte[] data;
int photonum;
public MyAsyncTask(byte[] data, int photonum) {
// TODO Auto-generated constructor stub
this.data = data;
this.photonum = photonum;
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
saveImage(data, photonum);
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
int photonum = StoredData.getInt(StoredData.M_CONTINUESHOTNUM, 3);
if (Util.CAMERA_STATE == InterSurfaceView.CAMERA_CONTINUOUSANDSELFTIME) {
}
super.onCancelled();
}
}
}