Android使用CameraKit快速使用相机
CameraKit 框架是一款极其简单的 Android 相机框架,代码量比使用原生的少很多。本章教程我们就来使用 CameraKit 搭建一个简单的相机,并实现点击保存图像。
首先添加 CameraKit 库:
dependencies {
implementation 'com.camerakit:camerakit:1.0.0-beta3.11'
implementation 'com.camerakit:jpegkit:0.1.0'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'
}
修改页面布局,其中最重要的 com.camerakit.CameraKitView
控件,这个控件可以实时预览图像。有几个重要的参数有说明一下,camera_facing 指定使用相机,camera_focus 设置对焦方式,camera_flash 是否开启闪光灯,camera_permissions 设置动态申请的权限。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.CameraKitActivity">
<com.camerakit.CameraKitView
android:id="@+id/camera"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:keepScreenOn="true"
app:camera_facing="back"
app:camera_focus="auto"
app:camera_flash="off"
app:camera_permissions="camera|storage" />
<Button
android:id="@+id/btn"
android:text="拍照"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
Java 代码就简单很多了,其中要在 Activity 生命周期中也添加 CameraKitView 的什么周期。CameraKit 也提供了动态权限申请接口,使用 cameraKitView.onRequestPermissionsResult()
接口实现动态权限申请,这样就完成了相机预览功能。拍照保存也很简单,使用 cameraKitView.captureImage()
就可以保存图像到本地了。这也太简单了。
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import com.camerakit.CameraKitView;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.FileOutputStream;
import kotlin.jvm.internal.Intrinsics;
public class CameraKitActivity extends AppCompatActivity {
private CameraKitView cameraKitView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_kit);
Button button = findViewById(R.id.btn);
cameraKitView = findViewById(R.id.camera);
if (!hasPermission()) {
requestPermission();
}
button.setOnClickListener(v ->
cameraKitView.captureImage((cameraKitView, capturedImage) -> {
File savedPhoto = new File(Environment.getExternalStorageDirectory(), "image.jpg");
try {
FileOutputStream outputStream = new FileOutputStream(savedPhoto.getPath());
outputStream.write(capturedImage);
outputStream.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}
})
);
}
@Override
protected void onStart() {
super.onStart();
cameraKitView.onStart();
}
@Override
protected void onResume() {
super.onResume();
cameraKitView.onResume();
}
@Override
protected void onPause() {
cameraKitView.onPause();
super.onPause();
}
@Override
protected void onStop() {
cameraKitView.onStop();
super.onStop();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NotNull String[] permissions, @NotNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
cameraKitView.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
最后别忘了添加权限申请。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.nfc.hce" />
CameraKit 开源地址:https://github.com/CameraKit/camerakit-android