声明摄像头权限
代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val camera = Camera.open()
camera.setPreviewTexture(SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES))
camera.setPreviewCallback { data, camera ->
println("摄像头正在采集图像")
}
camera.startPreview()
}
}
运行App的时候如果是Android6.0以上系统,则手动到设置里给权限,懒得搞动态申请了。
此时运行App,会发现只打印了一次“摄像头正在采集图像”,需要把Camera设置为成员变量,免得被垃圾回收器回收,如下:
class MainActivity : AppCompatActivity() {
private val camera = Camera.open()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
camera.setPreviewTexture(SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES))
camera.setPreviewCallback { data, camera ->
println("摄像头正在采集图像")
}
camera.startPreview()
}
}
此时运行App,会发现打印了4次“摄像头正在采集图像”,不知所以的话会让人头疼,其实SurfaceTexture对象也是没有强引用的,所以也会被垃圾回收器回收,所以需要我们设置为成员变量,以免被回收,代码如下:
class MainActivity : AppCompatActivity() {
private val camera = Camera.open()
private val surfaceTexture = SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
camera.setPreviewTexture(surfaceTexture)
camera.setPreviewCallback { data, camera ->
println("摄像头正在采集图像")
}
camera.startPreview()
}
}
OK,这次就正常了,就是这么简单的代码,我们实现了摄像头的无预览采集,预览回调中的data即采集到的图像数据。