实例介绍
【实例简介】,无界面,摄像头后台自动拍照,
【实例截图】
【核心代码】
package com.paul.faceshot; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import com.paul.faceshot.tool.DBHelper; import com.paul.faceshot.tool.FaceDetectTool; import com.paul.faceshot.tool.ParameterInit; import android.content.ContentValues; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.Camera; import android.hardware.Camera.ErrorCallback; import android.hardware.Camera.Face; import android.hardware.Camera.FaceDetectionListener; import android.hardware.Camera.PreviewCallback; import android.hardware.SensorEvent; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class CameraControl extends SurfaceView implements SurfaceHolder.Callback { private boolean openDebug = true; private String TAG = "FaceShot"; private static SurfaceHolder mHolder = null; private static Context mContext; private Camera camera; private DBHelper dbHelper; private int display_rotation; private FaceDetectionListener myFaceDetectionListener = new FaceDetectionListener() { @Override public void onFaceDetection(Face[] faces, Camera camera) { System.out.println("pfpf device find faces"); if (faces.length > 0 && ShotService.askFaceDetecedPermission()) { ShotService.lockFaceDeteced(); takePicture(); } } }; private PreviewCallback mPreviewCallback = new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { if (ShotService.askFaceDetecedPermission()) { ShotService.lockFaceDeteced(); Bitmap bmp = FaceDetectTool.decodeToBitMap(data, camera, display_rotation); if (FaceDetectTool.faceDeted(bmp)) { saveBitmap(bmp); } if (bmp != null) { bmp.recycle(); bmp = null; } } } }; private void saveBitmap(Bitmap bmp) { File f = getOutputMediaTempFile(); try { f.createNewFile(); } catch (IOException e) { } FileOutputStream fOut = null; try { fOut = new FileOutputStream(f); } catch (FileNotFoundException e) { e.printStackTrace(); } bmp.compress(Bitmap.CompressFormat.PNG, 100, fOut); try { fOut.flush(); } catch (IOException e) { e.printStackTrace(); } try { fOut.close(); } catch (IOException e) { e.printStackTrace(); } if (f != null) { broadcastFile(f); } System.out.println("pfpf save bmp"); } private Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback() { public void onShutter() { } }; private Camera.PictureCallback jpegPictureCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] data, Camera cam) { // n.b., this is automatically run in a different thread System.gc(); BitmapFactory.Options options = new BitmapFactory.Options(); // options.inMutable = true; options.inPurgeable = true; Bitmap bitmap = null; Bitmap bitmap_temp = BitmapFactory.decodeByteArray(data, 0, data.length, options); if (FaceDetectTool.faceDeted(bitmap_temp)) { bitmap = FaceDetectTool.rotBmpToDisplay(bitmap_temp, display_rotation); saveBitmap(bitmap); } else { System.gc(); return; } System.gc(); camera.startPreview(); } }; @SuppressWarnings("deprecation") public CameraControl(Context context) { super(context); mContext = context; dbHelper = DBHelper.getInstance(context); mHolder = getHolder(); mHolder.addCallback(this); // 设置该SurfaceView自己不维护缓冲 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void openCamera() { int camera_choose = ShotService.getCameraChoose(); System.out.println("pfpf choose=" camera_choose); ContentValues cameraData = dbHelper.downloadCameraData(camera_choose); int cameraId = ParameterInit.initCameraId(cameraData); camera = Camera.open(cameraId); camera.setErrorCallback(new ErrorCallback() { @Override public void onError(int arg, Camera camera) { return; } }); Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info); Camera.Parameters parameters = camera.getParameters(); display_rotation = ParameterInit.initDisplayOrientation(camera, info); ParameterInit.initWhiteBalance(parameters, cameraData); ParameterInit.initExposures(parameters); ParameterInit.initPictureSize(parameters, cameraData); parameters.setJpegQuality(100); ParameterInit.initPreviewSize(parameters, cameraData); dbHelper.uploadCameraData(cameraData); camera.setParameters(parameters); try { camera.setPreviewDisplay(mHolder); } catch (IOException e) { e.printStackTrace(); } // if (ParameterInit.initFaceDetection(camera, parameters, cameraData)) { if (false){ camera.setFaceDetectionListener(myFaceDetectionListener); camera.startFaceDetection(); camera.startPreview(); } else { camera.setPreviewCallback(mPreviewCallback); camera.startPreview(); } } private void takePicture() { takePictureWhenFocused(); } private void takePictureWhenFocused() { if (camera != null) { Camera.Parameters parameters = camera.getParameters(); // camera.setParameters(parameters); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { camera.enableShutterSound(false); } try { camera.takePicture(shutterCallback, null, jpegPictureCallback); } catch (RuntimeException e) { // just in case? We got a RuntimeException report here from 1 // user on Google Play; I also encountered it myself once of // Galaxy Nexus when starting up if (openDebug) Log.e(TAG, "runtime exception from takePicture"); e.printStackTrace(); } } if (openDebug) Log.d(TAG, "takePicture exit"); } private File getOutputMediaFile() { File mediaStorageDir = getImageFolder(); // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile = null; for (int count = 1; count <= 100; count ) { mediaFile = new File(mediaStorageDir.getPath() File.separator "FaceShot" "_" timeStamp ".jpg"); if (!mediaFile.exists()) { break; } } if (openDebug) { Log.d(TAG, "getOutputMediaFile returns: " mediaFile); } return mediaFile; } private File getOutputMediaTempFile() { File mediaStorageDir = getImageFolder(); // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile = null; for (int count = 1; count <= 100; count ) { mediaFile = new File( mediaStorageDir.getPath() File.separator "FaceShot_Temp" "_" timeStamp ".jpg"); if (!mediaFile.exists()) { break; } } if (openDebug) { Log.d(TAG, "getOutputMediaFile returns: " mediaFile); } return mediaFile; } private File getImageFolder() { String folder_name = "FaceShot"; File file = null; if (folder_name.length() > 0 && folder_name.lastIndexOf('/') == folder_name.length() - 1) { // ignore final '/' character folder_name = folder_name.substring(0, folder_name.length() - 1); } if (folder_name.startsWith("/")) { file = new File(folder_name); } else { file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), folder_name); } if (!file.exists()) { if (!file.mkdirs()) { return null; } broadcastFile(file); } return file; } private void broadcastFile(File file) { // note that the new method means that the new folder shows up as a file // when connected to a PC via MTP (at least tested on Windows 8) if (file.isDirectory()) { // this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, // Uri.fromFile(file))); // ACTION_MEDIA_MOUNTED no longer allowed on Android 4.4! Gives: // SecurityException: Permission Denial: not allowed to send // broadcast android.intent.action.MEDIA_MOUNTED // note that we don't actually need to broadcast anything, the // folder and contents appear straight away (both in Gallery on // device, and on a PC when connecting via MTP) // also note that we definitely don't want to broadcast // ACTION_MEDIA_SCANNER_SCAN_FILE or use scanFile() for folders, as // this means the folder shows up as a file on a PC via MTP (and // isn't fixed by rebooting!) } else { // both of these work fine, but using // MediaScannerConnection.scanFile() seems to be preferred over // sending an intent // this.sendBroadcast(new // Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, // Uri.fromFile(file))); MediaScannerConnection.scanFile(mContext, new String[] { file.getAbsolutePath() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { if (openDebug) { Log.d("ExternalStorage", "Scanned " path ":"); Log.d("ExternalStorage", "-> uri=" uri); } } }); } } public void closeCamera() { if (openDebug) { Log.d(TAG, "closeCamera()"); } if (camera != null) { camera.stopPreview(); camera.setPreviewCallback(null); camera.release(); camera = null; } System.gc(); } // private void reconnectCamera(boolean quiet) { // if (camera != null) { // just to be safe // try { // camera.reconnect(); // this.startCameraPreview(); // } catch (IOException e) { // closeCamera(); // } // try { // tryAutoFocus(false, false); // } catch (RuntimeException e) { // camera.release(); // camera = null; // openCamera(); // } // } // } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { System.out.println("pfpf surfacechanged"); } @Override public void surfaceCreated(SurfaceHolder holder) { this.setWillNotDraw(false); } @Override public void surfaceDestroyed(SurfaceHolder holder) { System.out.println("pfpf surfaceDestroyed"); this.closeCamera(); } public void onAccelerometerSensorChanged(SensorEvent event) { } public void onMagneticSensorChanged(SensorEvent event) { } }
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论