/*
*
* AiyaCamera.java
*
* Created by Wuwang on 2016/11/18
* Copyright © 2016年 深圳哎吖科技. All rights reserved.
*/
package com.aiyaapp.camera.sdk.widget;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.util.Log;
/**
* Description:
*/
@Deprecated
public class AiyaCamera implements IAiyaCamera{
private static final String TAG="AiyaCamera";
private Config mConfig;
private Camera mCamera;
private FlashMode mFlashMode=FlashMode.OFF;
private Camera.Size picSize;
private Camera.Size preSize;
private Point mPicSize;
private Point mPreSize;
public AiyaCamera(){
this.mConfig=new Config();
mConfig.minPreviewWidth=720;
mConfig.minPictureWidth=720;
mConfig.rate=1.778f;
}
public void open(int cameraId) {
mCamera=Camera.open(cameraId);
if(mCamera!=null){
Camera.Parameters param=mCamera.getParameters();
picSize=getPropPictureSize(param.getSupportedPictureSizes(),mConfig.rate,
mConfig.minPictureWidth);
preSize=getPropPreviewSize(param.getSupportedPreviewSizes(),mConfig.rate,mConfig
.minPreviewWidth);
param.setPictureSize(picSize.width,picSize.height);
param.setPreviewSize(preSize.width,preSize.height);
if(param.getMaxNumFocusAreas() > 0){
Rect areaRect1 = new Rect(-50, -50, 50, 50);
List<Camera.Area> focusAreas = new ArrayList<>();
focusAreas.add(new Camera.Area(areaRect1, 1000));
param.setFocusAreas(focusAreas);
}
// if the camera support setting of metering area.
if (param.getMaxNumMeteringAreas() > 0){
List<Camera.Area> meteringAreas = new ArrayList<>();
Rect areaRect1 = new Rect(-100, -100, 100, 100);
meteringAreas.add(new Camera.Area(areaRect1, 1000));
param.setMeteringAreas(meteringAreas);
}
// Log.e("wuwang","camera isVideoStabilizationSupported:"+param
// .isVideoStabilizationSupported());
// param.setVideoStabilization(true); //无效
// param.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT); //无效
// List<int[]> al=param.getSupportedPreviewFpsRange();
// for (int[] a:al){
// Log.e("previewSize","size->"+a[0]+"/"+a[1]);
// }
// param.setPreviewFpsRange(30000,30000);
param.setRecordingHint(true);
param.set("video-size",preSize.width+"x"+preSize.height);
mCamera.setParameters(param);
Camera.Size pre=param.getPreviewSize();
Camera.Size pic=param.getPictureSize();
mPicSize=new Point(pic.height,pic.width);
mPreSize=new Point(pre.height,pre.width);
}
}
public Camera getCamera(){
return mCamera;
}
public void setPreviewTexture(SurfaceTexture texture){
if(mCamera!=null){
try {
mCamera.setPreviewTexture(texture);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void setConfig(Config config) {
this.mConfig=config;
}
public void preview() {
if(mCamera!=null){
mCamera.startPreview();
}
}
public void setFlashMode(FlashMode mode){
this.mFlashMode=mode;
if(this.mCamera!=null){
Camera.Parameters p=mCamera.getParameters();
p.setFlashMode(mode.toString());
mCamera.setParameters(p);
}
}
public FlashMode getFlashMode(){
return mFlashMode;
}
public boolean switchTo(int cameraId) {
close();
open(cameraId);
return false;
}
public boolean close() {
if(mCamera!=null){
try{
mCamera.stopPreview();
}catch (Exception e){
e.printStackTrace();
}
try{
mCamera.release();
}catch (Exception e){
e.printStackTrace();
}
}
return false;
}
public Point getPreviewSize() {
return mPreSize;
}
public Point getPictureSize() {
return mPicSize;
}
public void setOnPreviewFrameCallback(final IAiyaCamera.PreviewFrameCallback callback) {
if(mCamera!=null){
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
callback.onPreviewFrame(data,mPreSize.x,mPreSize.y);
}
});
}
}
public void addBuffer(byte[] buffer){
if(mCamera!=null){
mCamera.addCallbackBuffer(buffer);
}
}
public void setOnPreviewFrameCallbackWithBuffer(final AiyaCamera.PreviewFrameCallback callback) {
if(mCamera!=null){
Log.e(TAG,"Camera set CallbackWithBuffer");
mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
callback.onPreviewFrame(data,mPreSize.x,mPreSize.y);
}
});
}
}
private Camera.Size getPropPreviewSize(List<Camera.Size> list, float th, int minWidth){
Collections.sort(list, sizeComparator);
int i = 0;
for(Camera.Size s:list){
if((s.height >= minWidth) && equalRate(s, th)){
break;
}
i++;
}
if(i == list.size()){
i = 0;
}
return list.get(i);
}
private Camera.Size getPropPictureSize(List<Camera.Size> list, float th, int minWidth){
Collections.sort(list, sizeComparator);
int i = 0;
for(Camera.Size s:list){
if((s.height >= minWidth) && equalRate(s, th)){
break;
}
i++;
}
if(i == list.size()){
i = 0;
}
return list.get(i);
}
private static boolean equalRate(Camera.Size s, float rate){
float r = (float)(s.width)/(float)(s.height);
if(Math.abs(r - rate) <= 0.03)
{
return true;
}
else{
return false;
}
}
private Comparator<Camera.Size> sizeComparator=new Comparator<Camera.Size>(){
public int compare(Camera.Size lhs, Camera.Size rhs) {
// TODO Auto-generated method stub
if(lhs.height == rhs.height){
return 0;
}
else if(lhs.height > rhs.height){
return 1;
}
else{
return -1;
}
}
};
public interface PreviewFrameCallback{
void onPreviewFrame(byte[] bytes, int width, int height);
}
}