最近在学习Camera的一些基础知识,因为是刚入门所以从api1开始慢慢熟悉,api1已经被弃用了所以也不会进行深入的学习,只是打算利用api1简单的实现预览、拍照、还有录像功能,然后在开始api2的学习。
其实网上关于Camera api1的实现代码是有很多的,但大多数都很复杂,对于我这样的初级入门者来说简直就是种折磨,单单一个预览功能就几百行代码,真有一种劝退的感觉,后来自己摸索发现这部分代码其实设置了很多的参数,例如自定义了SurfaceView、判断用前置摄像头还有后置摄像,还有预览时怎么解决画面旋转造成的画面扭曲等等.......
这里放下大佬的文章:https://www.jianshu.com/p/f8d0d1467584 其实还有很多只是找不着了,剩下的自己找吧。
不说这么多了下面回到正题:
在使用camera设备前,需要先获取到手机权限,在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
后两个不加也行,那是后面拍照保存的需要用到的。
配置完成后,到layout中配置xml文件一般来说是activity_main.xml,在里面添加SurfaceView
回到主类MainActivity中我是一次性把所有代码写在oncreate方法中了,觉得太乱可以自己写个方法然后在oncreate中调用
这里说明一下要使用camera.open();一定要做权限判断否则编译运行的时候app会闪退
if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)== PackageManager.PERMISSION_GRANTED)
下面是全部代码
package com.example.testdemo2;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.os.Bundle;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
public class MainActivityextends AppCompatActivity {
private Cameracamera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SurfaceView v=(SurfaceView)findViewById(R.id.surfaceView);
SurfaceHolder h=v.getHolder();
if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)== PackageManager.PERMISSION_GRANTED) {
h.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder h) {
camera=camera.open();
camera.setDisplayOrientation(90);
try {
camera.setPreviewDisplay(h);
camera.startPreview();
}catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.release();
}
});
}
}
}
这里再提一嘴,一开始我运行的时候是黑屏的,后来我发现是权限没开,你在手机给app开下权限就能显示了。