基本信息
源码名称:android 偷拍神器实例源码(后台自动拍照)
源码大小:9.74M
文件格式:.zip
开发语言:Java
更新时间:2017-02-10
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
,无界面,摄像头后台自动拍照,
,无界面,摄像头后台自动拍照,
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) { } }