package com.example.phoneguard.service;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.Camera;
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
public class BackgroundPhoto extends Service implements SurfaceHolder.Callback {
private static BackgroundPhoto instance;
private int caremaid;
public BackgroundPhoto() {
}
public BackgroundPhoto(int caremaid) {
this.caremaid = caremaid;
}
public static BackgroundPhoto getInstance(int caremaid) {
if (instance == null) {
instance = new BackgroundPhoto(caremaid);
}
return instance;
}
private WindowManager windowManager;
private SurfaceView surfaceView;
private Camera camera = null;
String TAG = "BackgroundPhoto";
Context mContext;
private Camera.Parameters mParameters;
@Override
public void onCreate() {
mContext = this;
// Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback
windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
surfaceView = new SurfaceView(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.width = 1;
params.height = 1;
params.alpha = 0;
//检查版本,注意当type为TYPE_APPLICATION_OVERLAY时,铺满活动窗口,但在关键的系统窗口下面,如状态栏或IME
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
// 屏蔽点击事件
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
windowManager.addView(surfaceView, params);
surfaceView.getHolder().addCallback(this);
}
// Method called right after Surface created (initializing and starting MediaRecorder)
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
/* camera = Camera.open();
camera.unlock();*/
initCamera();
}
// 初始化摄像头
private void initCamera() {
// 如果存在摄像头
if (checkCameraHardware(mContext.getApplicationContext())) {
// 获取摄像头(首选前置,无前置选后置)
if (openFacingFrontCamera()) {
Log.i(TAG, "openCameraSuccess");
// 进行对焦
autoFocus();
} else {
Log.i(TAG, "openCameraFailed");
}
}
}
// 对焦并拍照
private void autoFocus() {
try {
// 因为开启摄像头需要时间,这里让线程睡两秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
startPreview();
// 自动对焦
camera.autoFocus(myAutoFocus);
// 对焦后拍照
// camera.unlock();
camera.takePicture(null, null, myPicCallback);
}
private void startPreview() {
setCameraParameters();
camera.startPreview();
}
/**
* 设置Camera参数
* 设置预览界面的宽高,图片保存的宽、高
*/
private void setCameraParameters() {
if (camera != null) {
Log.d(TAG, "setCameraParameters >> begin. mCamera != null");
if (mParameters == null) {
mParameters = camera.getParameters();
}
int PreviewWidth = 0;
int PreviewHeight = 0;
List sizeList = mParameters.getSupportedPreviewSizes();
if (sizeList.size() > 1) {
Iterator itor = sizeList.iterator();
while (itor.hasNext()) {
Camera.Size cur = itor.next();
if (cur.width >= PreviewWidth
&& cur.height >= PreviewHeight) {
PreviewWidth = cur.width;
PreviewHeight = cur.height;
break;
}
}
} else if (sizeList.size() == 1) {
Camera.Size size = sizeList.get(0);
PreviewWidth = size.width;
PreviewHeight = size.height;
}
mParameters.setPreviewSize(PreviewWidth, PreviewHeight); //获得摄像区域的大小
mParameters.setPictureSize(PreviewWidth, PreviewHeight);//设置拍出来的屏幕大小
try {
camera.setParameters(mParameters);
} catch (Exception e) {
Camera.Parameters parameters = camera.getParameters();// 得到摄像头的参数
camera.setParameters(parameters);
}
} else {
Log.e(TAG, "setCameraParameters >> mCamera == null!!");
}
}
// 判断是否存在摄像头
private boolean checkCameraHardware(Context context) {
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA)) {
// 设备存在摄像头
return true;
} else {
// 设备不存在摄像头
return false;
}
}
// 得到后置摄像头
private boolean openFacingFrontCamera() {
// 尝试开启前置摄像头
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
camera = Camera.open(camIdx);
try {
// 这里的myCamera为已经初始化的Camera对象
camera.setPreviewDisplay(surfaceView.getHolder());
} catch (IOException e) {
e.printStackTrace();
camera.stopPreview();
camera.release();
camera = null;
}
camera.startPreview();
return true;
}
// 自动对焦回调函数(空实现)
private Camera.AutoFocusCallback myAutoFocus = new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
}
};
// 拍照成功回调函数
private Camera.PictureCallback myPicCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 完成拍照后关闭Activity
// 将得到的照片进行270°旋转,使其竖直
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix matrix = new Matrix();
matrix.preRotate(90);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA);
String imageFileName = "Photo" + dateFormat.format(new Date(System.currentTimeMillis())) + ".jpg";
// 创建并保存图片文件
File pictureFile = new File(Environment.getExternalStorageDirectory() + "/1/", imageFileName);
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 75, fos);
fos.close();
} catch (Exception error) {
Toast.makeText(mContext, "拍照失败", Toast.LENGTH_SHORT)
.show();
Log.i(TAG, "保存照片失败" + error.toString());
error.printStackTrace();
camera.stopPreview();
camera.release();
camera = null;
}
Log.i(TAG, "获取照片成功" + pictureFile.getAbsolutePath());
Toast.makeText(mContext, "获取照片成功", Toast.LENGTH_SHORT)
.show();
camera.stopPreview();
camera.release();
camera = null;
}
};
// Stop recording and remove SurfaceView
@Override
public void onDestroy() {
camera.release();
windowManager.removeView(surfaceView);
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
然后start此service就可以了