package com.andbase.demo.activity; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.database.Cursor; import android.graphics.Bitmap; import android.hardware.Camera; import android.hardware.Camera.AutoFocusCallback; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.PreviewCallback; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageView; import com.andbase.demo.R; import com.andbase.demo.camera.CameraManager; import com.andbase.demo.camera.Config; import com.andbase.library.util.AbImageUtil; import com.andbase.library.util.AbToastUtil; import java.io.File; import java.io.OutputStream; import java.util.Random; public class CaptureActivity extends Activity implements SurfaceHolder.Callback { /** UI相关. */ private SurfaceView surfaceView = null; /** 拍照按钮. */ private Button camBtn,flashBtn,focusBtn,okBtn,cancleBtn; /** 布局. */ private FrameLayout camLayout,previewLayout; /** 图片结果. */ private ImageView imgResult; /** 控制相关. */ private boolean hasSurface = false; /** 当前路径. */ private String path = null; /** * 开始. * @param savedInstanceState */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //屏幕参数 int cameraId = this.getIntent().getIntExtra("cameraId", 0); int orientation = this.getIntent().getIntExtra("orientation", 0); Config.cameraId = cameraId; Config.orientation = orientation; Config.focusMode = 1; //强制为横屏 if(Config.orientation==0){ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }else{ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } setContentView(R.layout.camera_main); // 初始化 CameraManager CameraManager.init(getApplication()); surfaceView = (SurfaceView) findViewById(R.id.preview_view); SurfaceHolder surfaceHolder = (SurfaceHolder)surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surfaceView.setKeepScreenOn(true); //UI相关 camBtn = (Button)this.findViewById(R.id.shot_btn); flashBtn = (Button)this.findViewById(R.id.flash_btn); focusBtn = (Button)this.findViewById(R.id.focus_btn); okBtn = (Button)this.findViewById(R.id.ok_btn); cancleBtn = (Button)this.findViewById(R.id.cancle_btn); camLayout = (FrameLayout)this.findViewById(R.id.cam_layout); previewLayout = (FrameLayout)this.findViewById(R.id.preview_layout); camLayout.setVisibility(View.VISIBLE); previewLayout.setVisibility(View.GONE); imgResult = (ImageView)this.findViewById(R.id.imgResult); if(cameraId==1){ flashBtn.setVisibility(View.GONE); } okBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("path", path); setResult(RESULT_OK,intent); finish(); } }); //拍照的回调 CameraManager.get().setPictureCallback(new PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { //关闭预览 CameraManager.get().stopPreview(); Bitmap cameraBitmap = AbImageUtil.getBitmap(data,1280,720); camLayout.setVisibility(View.INVISIBLE); previewLayout.setVisibility(View.VISIBLE); imgResult.setImageBitmap(cameraBitmap); //插入到相册数据库 try{ String url = insertImage(CaptureActivity.this.getContentResolver(), cameraBitmap, "andbase", "andbase"); path = getRealFilePath(CaptureActivity.this,Uri.parse(url)); Log.e("onPictureTaken", "onPictureTaken insertImage:"+path); AbToastUtil.showToast(CaptureActivity.this,"insertImage:"+path); }catch (Exception e){ e.printStackTrace(); } } }); //对焦的控制 CameraManager.get().setAutoFocusCallback(new AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if(success){ //对焦成功 }else{ /*//关键代码:自动对焦 new Handler().postDelayed(new Runnable(){ @Override public void run() { CameraManager.get().requestAutoFocus(); } }, 1000);*/ } if(Config.focusMode == 1) { CameraManager.get().startPreview(); } } }); // 预览 CameraManager.get().setPreviewCallback(new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { } }); //拍照 camBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CameraManager.get().takePicture(); //声音 shootSound(); } }); //点击屏幕 surfaceView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { imgResult.setImageBitmap(null); //继续预览 CameraManager.get().startPreview(); } }); //闪光灯 flashBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CameraManager.get().toogleFlash(); } }); if(Config.focusMode == 0){ //手动对焦 focusBtn.setVisibility(View.VISIBLE); focusBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CameraManager.get().requestAutoFocus(); } }); } cancleBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { imgResult.setImageBitmap(null); camLayout.setVisibility(View.VISIBLE); previewLayout.setVisibility(View.INVISIBLE); CameraManager.get().startPreview(); } }); } /** * 打开相机. * * @param surfaceHolder the surface holder */ private void initCamera(SurfaceHolder surfaceHolder) { try { CameraManager manager = CameraManager.get(); Log.e("initCamera", "initCamera 相机界面初始化:"+Config.cameraId); manager.openDriver(surfaceHolder,Config.cameraId); manager.startPreview(); }catch (Exception e) { e.printStackTrace(); } } /** * surfaceChanged. * @param holder * @param format * @param width * @param height */ @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //Log.e("surfaceChanged", "surfaceChanged 相机界面改变"); } /** * surfaceCreated. * @param holder */ @Override public void surfaceCreated(SurfaceHolder holder) { if (!hasSurface) { initCamera(holder); hasSurface = true; } } /** * surfaceDestroyed. * @param holder */ @Override public void surfaceDestroyed(SurfaceHolder holder) { hasSurface = false; } /** * 暂停,将相机关闭. */ @Override protected void onPause() { CameraManager.get().stopPreview(); CameraManager.get().closeDriver(); Log.e("onPause", "onPause 相机界面暂停"); super.onPause(); } /** * 恢复. */ @Override protected void onResume() { //恢复相机 SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); Log.e("hasSurface", "hasSurface:"+hasSurface); if (hasSurface) { //SurfaceView存在就重新打开相机 initCamera(surfaceHolder); } else { //SurfaceView不存在,重新设置surfaceHolder,同时SurfaceView会被重建 surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); CameraManager.get().startPreview(); } //关键代码:恢复数据 Log.e("onResume", "onResume 相机界面恢复"); super.onResume(); } /** * 完成. */ @Override public void finish() { super.finish(); Log.e("finish", "finish 相机界面释放"); } /** * * 释放资源. */ @Override protected void onDestroy() { super.onDestroy(); } /** * 播放系统拍照声音 */ public void shootSound(){ /*MediaPlayer mp = null; AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); int volume = am.getStreamVolume( AudioManager.STREAM_NOTIFICATION); if (volume != 0) { if (mp == null) mp = MediaPlayer.create(this, Uri.parse("file:///system/media/audio/ui/camera_click.ogg")); if (mp != null) mp.start(); } */ } public String getRealFilePath(final Context context, final Uri uri ) { if ( null == uri ) return null; final String scheme = uri.getScheme(); String data = null; if ( scheme == null ) data = uri.getPath(); else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) { data = uri.getPath(); } else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) { Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null ); if ( null != cursor ) { if ( cursor.moveToFirst() ) { int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA ); if ( index > -1 ) { data = cursor.getString( index ); } } cursor.close(); } } return data; } public static final String insertImage(ContentResolver cr, Bitmap source, String title, String description) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, title); values.put(MediaStore.Images.Media.DESCRIPTION, description); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); Uri url = null; String stringUrl = null; try { url = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); if (source != null) { OutputStream imageOut = cr.openOutputStream(url); try { source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut); } finally { imageOut.close(); } } else { cr.delete(url, null, null); url = null; } } catch (Exception e) { if (url != null) { cr.delete(url, null, null); url = null; } } if (url != null) { stringUrl = url.toString(); } return stringUrl; } }