最近在做一个项目,需要用到无预览拍照功能,Camera已被官方废弃,所有计划用Camera2来实现,在度娘上找了一翻,感觉Camera2蛮强大的,但关于后台无预览拍照的资源不是还多,找不到满足自己的需求。于是乎,自己下载了Camera2官方Demo研究了一翻,感觉Camera2很复杂,一堆接口,各种参数,自己菜鸟,几乎懵逼。但搞懂了Demo中拍照功能的几个关键点:
1、使用继承TextureView的AutoFitTextureView作为拍照预览的控件(不明白为什么不直接用TextureView);
2、实例化mFile(照片保存路径);
3、在AutoFitTextureView的方法onSufaceTextureViewAvailable中执行openCamera(width,height)方法;
4、在setUpCameraOutputs(width,height)中设置摄像头ID、图片格式、图片大小、前置/后置摄像头等信息;
5、通过takePicture()方法来执行拍照;
6、最后在onCaptureCompleted回调方法中操作mFile即可,此时mFile已指向拍照好的图片。
有了以上几点,其他代码不懂也没关系,可以获得照片是目的,接下来就是实现我的需求了。想了下两个思路,一是将预览控件设置到最小,放在activity上,设置为不可见。二是将预览控件设置到最小,添加到系统主界面上。由于需要后台拍照,即需要即使activity已经销毁了,还能继续运行,因此思路一似乎不可行,于是采用了思路二。把自己研究一个多小时的成果记录下,当作笔记,勿喷。
AndroidManifest.xml,比较简单,几个权限,一个服务,一个界面,第一个权限为了能将预览控件添加到系统界面上,外部读写权限为是能保存图片。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.test.com.takepictrueinbackground">
<!-- 允许在其他应用上显示对话框权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- 外部存储读写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--配置Camera权限-->
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<ca