public class CameraActivity extends BaseActivity implements View.OnClickListener {
public static final String UPLOAD_PATH = Constants.SDCARD_PATH
+ "upload/claim/";
public static final int MASK_NULL = 0;
public static final int MASK_FRONT = 1;
public static final int MASK_FRAME = 2;
public static final int MASK_OBJECT = 3;
private static int maskType = MASK_NULL;
private int position;
private String uri;
private Camera camera;
private CameraHelper mCameraHelper;
private Camera.Parameters parameters = null;
private Camera.Size previewSize = null;
private int screenWidth;
private int screenHeight;
private static final String NOT_AUTO_FOCUS = "fixed__";
private String autofocusType = NOT_AUTO_FOCUS;
private static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture";
private boolean isFlashOpen ;
private String mFilePath;
private ImageButton btn_flash;
private ImageButton btn_takephoto;
private View layout_takepic_con;
private View layout_take_finish;
private OrientationEventListener mOrientationListener;
private int mScreenExifOrientation = 0;
private ImageView mImageMask ;
private TextView tips_top;
private TextView tips_bottom;
private File mJpgFile;
public static void setMaskType(int type){
maskType = type;
}
private boolean isFromGallery;
private boolean isFromUploadPage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int pageNumber = 1;
DisplayMetrics metrics = getResources().getDisplayMetrics();
Intent i = getIntent();
position = i.getIntExtra("position", -1);
initMasks(position);
uri = i.getStringExtra("uri");
isFromGallery=i.getBooleanExtra("isFromGallery", false);
isFromUploadPage=isFromUploadPage(i.getBooleanExtra("isFromUploadPage", false),!TextUtils.isEmpty(uri));
if (TextUtils.isEmpty(uri)) {
gotoShootingView();
} else {
Bitmap bm = PathTurnUtils.getBitmap(uri, metrics.widthPixels, metrics.heightPixels);
gotoPreviewView(bm);
}
}
private boolean isFromUploadPage(boolean FromUploadPage,boolean getUri){
return FromUploadPage && getUri;
}
private void initMasks(int position) {
if (position == 0) {
maskType = MASK_FRONT;
} else {
maskType = MASK_NULL;
}
}
@Override
protected void onDestroy() {
if (mOrientationListener != null) {
mOrientationListener.disable();
}
if (MessageDialogUtil.isShow()) {
MessageDialogUtil.dismissAlertDialog();
}
super.onDestroy();
}
private void gotoFirstView(int pageNumber) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_camera_firstpage);
ImageView main = (ImageView) findViewById(R.id.iv_main);
if (!TextUtils.isEmpty(uri)) {
Bitmap bm = null;
main.setImageBitmap(bm);
} else {
main.setImageResource(ImageResource.get(position));
}
ImageView back = (ImageView) findViewById(R.id.iv_back);
back.setOnClickListener(this);
TextView shoot = (TextView) findViewById(R.id.tv_shoot);
shoot.setOnClickListener(this);
}
private void gotoShootingView(){
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int i) {
if(45 <= i && i < 135) {
mScreenExifOrientation = 180;
} else if(135 <= i && i < 225) {
mScreenExifOrientation = 270;
} else if(225 <= i && i < 315) {
mScreenExifOrientation = 0;
} else {
mScreenExifOrientation = 90;
}
}
};
mOrientationListener.enable();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.camera_layout);
SurfaceView surfaceView = (SurfaceView) this.findViewById(R.id.SurfaceView01);
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().setKeepScreenOn(true);
surfaceView.getHolder().addCallback(new SurfaceCallback());
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
mCameraHelper = new CameraHelper(this);
try {
Uri mUri = getIntent().getExtras().getParcelable(MediaStore.EXTRA_OUTPUT);
mFilePath = UriUtils.getPath(this, mUri);
}catch (Exception e){
e.printStackTrace();
}
btn_flash = (ImageButton) findViewById(R.id.btn_flash);
btn_flash.setOnClickListener(mListener);
btn_takephoto = (ImageButton) findViewById(R.id.btn_takephoto);
btn_takephoto.setOnClickListener(mListener);
if(isSurportFlash()){
btn_flash.setVisibility(View.VISIBLE);
}else{
btn_flash.setVisibility(View.INVISIBLE);
}
layout_takepic_con = findViewById(R.id.layout_takepic_con);
layout_take_finish = findViewById(R.id.layout_take_finish);
mImageMask = (ImageView) findViewById(R.id.img_mask);
tips_top = (TextView) findViewById(R.id.tv_tips_top);
tips_bottom = (TextView) findViewById(R.id.tv_tips_bottom);
switch(maskType){
case MASK_FRONT:
mImageMask.setImageResource(R.drawable.car_mask);
tips_top.setText(R.string.camera_tips_all);
tips_top.setVisibility(View.VISIBLE);
break;
default:
mImageMask.setImageDrawable(null);
tips_top.setText("");
break;
}
}
private void gotoPreviewView(Bitmap result) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.activity_camera_preview);
ImageView i = (ImageView) findViewById(R.id.iv_main_picture);
ImageView delete = (ImageView) findViewById(R.id.tv_camera_delete);
ImageView back = (ImageView) findViewById(R.id.iv_back);
back.setOnClickListener(this);
delete.setVisibility(View.GONE);
i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
i.setImageBitmap(result);
final ImageView s = (ImageView) findViewById(R.id.iv_standard);
final ViewGroup compare = (ViewGroup) findViewById(R.id.rl_compare);
if ((position >=0 && position <=3) || (position >= 100 && position <= 103)) {
s.setImageResource(ImageResource.get(position));
TextView title = (TextView) findViewById(R.id.tv_title);
title.setText(getTitle(position));
compare.setVisibility(View.VISIBLE);
compare.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
s.setVisibility(View.VISIBLE);
} else if (action == MotionEvent.ACTION_UP) {
s.setVisibility(View.GONE);
}
return true;
}
});
} else {
s.setVisibility(View.GONE);
compare.setVisibility(View.GONE);
delete.setVisibility(View.VISIBLE);
}
ViewGroup use = (ViewGroup) findViewById(R.id.rl_use);
ViewGroup retake = (ViewGroup) findViewById(R.id.rl_retake);
use.setOnClickListener(this);
retake.setOnClickListener(this);
delete.setOnClickListener(this);
}
private String getTitle(int position) {
String[] titlesA = {"全车图片", "损失远景", "损失近景", "损失细节"};
String[] titlesB = {"被保人身份证", "行驶证", "驾驶证", "被保人银行卡"};
if (position >=0 && position <= 3) {
return titlesA[position];
} else if (position >= 100 && position <= 103) {
return titlesB[position - 100];
}
return "其他";
}
private OnDeletePhotoListener deletePhotoListener = null;
public interface OnDeletePhotoListener {
public void onDeletePhotoListener();
}
private void createDirIfNotExist(final String uploadPath) {
File out = new File(uploadPath);
if (!out.exists()) {
out.mkdirs();
}
}
private void usePhoto() {
Intent headimg = new Intent(Intent.ACTION_PICK, null);
headimg.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(headimg, ClaimLossCertyChatAcitivty.RequestCode.GALLERY.ordinal());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data==null){
return;
}
if (requestCode ==ClaimLossCertyChatAcitivty.RequestCode.GALLERY.ordinal()){
Uri galleryUri = data.getData();
if (galleryUri == null) {
return;
}
uri= UriUtils.getPath(this, galleryUri);
DisplayMetrics metrics = getResources().getDisplayMetrics();
Bitmap bm = PathTurnUtils.getBitmap(uri, metrics.widthPixels, metrics.heightPixels);
gotoPreviewView(bm);
}
}
private PicturePickerDialog pickerDialog;
public void onButtonClick(View v){
switch (v.getId()) {
case R.id.btn_repeat:
if(camera != null){
camera.startPreview();
}
showTakePicorFinish(true);
break;
case R.id.btn_confirm:
setResult(RESULT_OK);
finish();
break;
case R.id.btn_return:
setResult(RESULT_CANCELED);
finish();
break;
default:break;
}
}
private String createImgName() {
StringBuffer sb = new StringBuffer();
sb.append(Preferences.getInstance(getApplicationContext()).getUid())
.append("_").append(AutoClaimUtils.getAutoClaimCaseId()).append("_")
.append(System.currentTimeMillis()).append(".jpg");
return sb.toString();
}
private void showIsDeletePic() {
MessageDialogUtil.showAlertDialog(this, "温馨提示", "确定删除这张照片吗?", "是的", "取消");
MessageDialogUtil.setLeftListener(new MessageDialogUtil.OnLeftListener() {
@Override
public void onClick() {
mJpgFile.delete();
Intent back = new Intent();
back.putExtra("uri", "");
back.putExtra("position", position);
setResult(RESULT_OK, back);
finish();
}
});
}
private void showTakePicorFinish(boolean istrue){
if(istrue){
layout_takepic_con.setVisibility(View.VISIBLE);
mImageMask.setVisibility(View.VISIBLE);
layout_take_finish.setVisibility(View.GONE);
tips_bottom.setVisibility(View.VISIBLE);
tips_top.setVisibility(View.VISIBLE);
}else{
layout_takepic_con.setVisibility(View.GONE);
layout_take_finish.setVisibility(View.VISIBLE);
mImageMask.setVisibility(View.INVISIBLE);
tips_bottom.setVisibility(View.INVISIBLE);
tips_top.setVisibility(View.INVISIBLE);
}
}
private View.OnClickListener mListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (camera != null) {
switch (v.getId()) {
case R.id.btn_takephoto:
takePic();
break;
case R.id.btn_flash:
btn_flash.setSelected(!btn_flash.isSelected());
setFlashOn(btn_flash.isSelected());
break;
default:break;
}
}
}
};
private void takePic(){
if (autofocusType.contains(FOCUS_MODE_CONTINUOUS_PICTURE)) {
if (android.os.Build.VERSION.SDK_INT == 15) {
try {
camera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(final boolean success, final Camera camera) {
camera.takePicture(null, null, new MyPictureCallback());
}
});
} catch (Exception e) {
camera.takePicture(null, null, new MyPictureCallback());
}
} else {
camera.takePicture(null, null, new MyPictureCallback());
}
} else if (autofocusType.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
camera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(final boolean success, final Camera camera) {
if (success) {
camera.takePicture(null, null, new MyPictureCallback());
} else {
Toast.makeText(getApplicationContext(), "拍照失败",
Toast.LENGTH_SHORT).show();
}
}
});
} else {
camera.takePicture(null, null, new MyPictureCallback());
}
}
private void setFlashOn(boolean isOn) {
if(camera != null ) {
isFlashOpen = isOn;
Camera mCamera = camera;
if (isFlashOpen) {
if (mCamera != null) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
mCamera.setParameters(parameters);
}
} else {
if (mCamera != null) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
}
}
}
}
public boolean isSurportFlash() {
PackageManager pm = this.getPackageManager();
FeatureInfo[] features = pm.getSystemAvailableFeatures();
for (FeatureInfo f : features) {
if (PackageManager.FEATURE_CAMERA_FLASH.equals(f.name)){
return true;
}
}
return false;
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.iv_back:
finish();
break;
case R.id.tv_shoot:
gotoShootingView();
break;
case R.id.rl_use:
Intent back = new Intent();
back.putExtra("uri", uri);
back.putExtra("position", position);
setResult(RESULT_OK, back);
finish();
break;
case R.id.tv_camera_delete:
showIsDeletePic();
break;
case R.id.rl_retake:
if(!isFromUploadPage) {
if (!isFromGallery) {
gotoShootingView();
} else {
usePhoto();
}
}else{
if (pickerDialog == null) {
pickerDialog = new PicturePickerDialog(
CameraActivity.this,
new PicturePickerDialog.IRequestCode() {
@Override
public int photoCode() {
return ClaimLossCertyChatAcitivty.RequestCode.GALLERY.ordinal();
}
@Override
public int cameraCode() {
CameraActivity.setMaskType(CameraActivity.MASK_NULL);
return ClaimLossCertyChatAcitivty.RequestCode.CAMERA.ordinal();
}
}){
public void showPickDialog(final String uploadPath, final String filename,
boolean delete) {
String shareDialogTitle = CameraActivity.this
.getString(R.string.pick_dialog_title);
if (!delete) {
MMAlert.showAlert(CameraActivity.this, shareDialogTitle, CameraActivity.this
.getResources().getStringArray(R.array.picks_pics_item),
null, new MMAlert.OnAlertSelectId() {
@Override
public void onClick(int whichButton) {
switch (whichButton) {
case 0:
createDirIfNotExist(uploadPath);
isFromUploadPage=false;
isFromGallery=false;
gotoShootingView();
break;
case 1:
createDirIfNotExist(uploadPath);
isFromUploadPage=false;
isFromGallery=true;
usePhoto();
break;
}
}
});
} else {
MMAlert.showAlert(
CameraActivity.this,
shareDialogTitle,
CameraActivity.this.getResources().getStringArray(
R.array.picks_pics_delete_item), null,
new MMAlert.OnAlertSelectId() {
@Override
public void onClick(int whichButton) {
switch (whichButton) {
case 0:
if (deletePhotoListener != null) {
deletePhotoListener.onDeletePhotoListener();
}
break;
case 1:
createDirIfNotExist(uploadPath);
isFromUploadPage=false;
isFromGallery=false;
gotoShootingView();
break;
case 2:
createDirIfNotExist(uploadPath);
isFromUploadPage=false;
isFromGallery=true;
usePhoto();
break;
}
}
});
}
}
};
}
pickerDialog.setType(true);
pickerDialog.showPickDialog(UPLOAD_PATH, createImgName(), false);
}
break;
}
}
private final class MyPictureCallback implements Camera.PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
if(camera != null ){
camera.stopPreview();
}
Bitmap bMapRotate = null;
Bitmap bMap = BitmapFactory.decodeByteArray(data, 0, data.length);
if(mScreenExifOrientation == 90){
Matrix matrix = new Matrix();
matrix.reset();
matrix.postRotate(0);
bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true);
}else if(mScreenExifOrientation == 270){
Matrix matrix = new Matrix();
matrix.reset();
matrix.postRotate(180);
bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true);
}else if (mScreenExifOrientation != 0) {
Matrix matrix = new Matrix();
matrix.reset();
matrix.postRotate(mScreenExifOrientation);
bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), bMap.getHeight(), matrix, true);
} else {
bMapRotate = bMap;
}
if(bMapRotate != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bMapRotate.compress(Bitmap.CompressFormat.JPEG, 80, baos);
data = baos.toByteArray();
baos.close();
}
saveToSDCard(data);
gotoPreviewView(bMapRotate);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "拍照失败", Toast.LENGTH_SHORT).show();
}
}
}
public void saveToSDCard(byte[] data) throws IOException {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String filename = format.format(date) + ".jpg";
File fileFolder = new File(Environment.getExternalStorageDirectory() + "/carowner/");
if (!fileFolder.exists()) {
fileFolder.mkdir();
}
if(TextUtils.isEmpty(mFilePath)){
mJpgFile = new File(fileFolder, filename);
}else{
mJpgFile = new File(mFilePath);
}
FileOutputStream outputStream = new FileOutputStream(mJpgFile);
outputStream.write(data);
outputStream.close();
uri = mJpgFile.getAbsolutePath();
}
private void ShowErrorDialog(){
if (!MessageDialogUtil.isShow()){
MessageDialogUtil.showAlertDialog(this, getString(R.string.dialog_defalut_title), "相机打开失败,请检查系统权限设置。","确定",null);
}
MessageDialogUtil.setLeftListener(new MessageDialogUtil.OnLeftListener() {
@Override
public void onClick() {
MessageDialogUtil.dismissAlertDialog();
finish();
}
});
}
private final class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
showTakePicorFinish(true);
try {
camera = mCameraHelper.openBackCamera();
initParameters(camera.getParameters());
camera.setPreviewDisplay(holder);
camera.setDisplayOrientation(getPreviewDegree(CameraActivity.this));
camera.startPreview();
} catch (Exception e) {
e.printStackTrace();
ShowErrorDialog();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.release();
camera = null;
}
}
}
private void initParameters(Camera.Parameters param){
previewSize = null;
List<Camera.Size> previewList = param.getSupportedPreviewSizes();
Collections.sort(previewList, new MyComparator());
float screenScale = screenHeight/ (float)screenWidth;
for (Camera.Size preSize : previewList) {
Log.v("Demo", "----size:" + preSize.width + "x" + preSize.height);
if (preSize.width * preSize.height > 1200000) {
continue;
}
float preScale = preSize.width / (float) preSize.height;
float tag = Math.abs(preScale - screenScale);
if (tag < 0.03) {
previewSize = preSize;
break;
}
}
if (previewSize == null) {
previewSize = previewList.get(0);
}
Log.v("Demo", "----Use size:" + previewSize.width + "x" + previewSize.height);
param.setPreviewSize(previewSize.width, previewSize.height);
List<String> mSuportList = param.getSupportedFocusModes();
if (mSuportList.contains(FOCUS_MODE_CONTINUOUS_PICTURE)) {
param.setFocusMode(FOCUS_MODE_CONTINUOUS_PICTURE);
autofocusType = FOCUS_MODE_CONTINUOUS_PICTURE;
} else if (mSuportList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
param.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
autofocusType = Camera.Parameters.FOCUS_MODE_AUTO;
} else {
autofocusType = NOT_AUTO_FOCUS;
}
param.setPictureFormat(PixelFormat.JPEG);
Camera.Size mSize = camera.new Size(1280, 720);
List<Camera.Size> mSizeList = param.getSupportedPictureSizes();
Collections.sort(mSizeList, new Comparator<Camera.Size>() {
@Override
public int compare(Camera.Size arg0, Camera.Size arg1) {
if (arg0.width > arg1.width) {
return -1;
} else if (arg0.width == arg1.width) {
if (arg0.height > arg1.height) {
return 1;
} else {
return -1;
}
}
return 1;
}
});
for (Camera.Size size2 : mSizeList) {
Log.i("ASDF", "Supported: " + size2.width + "x" + size2.height);
if (mSize.width < size2.width) {
continue;
} else {
mSize = size2;
break;
}
}
Log.i("ASDF", "Use : " + mSize.width + "x" + mSize.height);
param.setPictureSize(mSize.width, mSize.height);
param.setJpegQuality(80);
if(isSurportFlash()) {
setFlashOn(btn_flash.isSelected());
}
camera.setParameters(param);
}
private class MyComparator implements Comparator<Camera.Size> {
@Override
public int compare(Camera.Size size, Camera.Size size2) {
return size2.width * size2.height - size.width * size.height;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_CAMERA:
if (camera != null && event.getRepeatCount() == 0) {
takePic();
}
}
return super.onKeyDown(keyCode, event);
}
public static int getPreviewDegree(Activity activity) {
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degree = 0;
switch (rotation) {
case Surface.ROTATION_0:
degree = 90;
break;
case Surface.ROTATION_90:
degree = 0;
break;
case Surface.ROTATION_180:
degree = 270;
break;
case Surface.ROTATION_270:
degree = 180;
break;
}
return degree;
}
public static class ImageResource {
public static int WHOLE_CAR = R.drawable.damage_whole_car1;
public static int DAMAGE_FAR = R.drawable.damage_distant_scenery1;
public static int DAMAGE_NEAR = R.drawable.damage_nearby_scenery1;
public static int DAMAGE_DETAILS = R.drawable.damage_detail1;
public static int INSURED_PESON_ID = R.drawable.certificate_identity_card1;
public static int CAR_LICENSE = R.drawable.certificate_steer_license1;
public static int DRIVER_LICENSE = R.drawable.certificate_driving_license1;
public static int INSURED_PERSON_BANK_CARD = R.drawable.certificate_bank_card1;
public static int get(int position) {
switch (position) {
case 0:
return WHOLE_CAR;
case 1:
return DAMAGE_FAR;
case 2:
return DAMAGE_NEAR;
case 3:
return DAMAGE_DETAILS;
case 100:
return INSURED_PESON_ID;
case 101:
return CAR_LICENSE;
case 102:
return DRIVER_LICENSE;
case 103:
return INSURED_PERSON_BANK_CARD;
default:
return WHOLE_CAR;
}
}
}
}