简介
使用 autojs 结合 Android API 开发一个简单的摄像头应用拍照,实现拍照并保存功能。
源码
var CameraCust = (function () {
function CameraCust() {
this._camera = null;
}
CameraCust.prototype.init = function () {
var self = this;
if (!this.checkCameraPermission()) {
throw new Error('没有摄像头权限,请先授权!');
}
ui.run(function () {
// 初始化摄像头
self._camera = android.hardware.Camera.open();
var surfaceTexture = new android.graphics.SurfaceTexture(10);
try {
self._camera.setPreviewTexture(surfaceTexture);
self._camera.startPreview();
} catch (e) {
toast('初始化摄像头失败: ' + e.message);
}
});
};
/**
* 检查摄像头权限
* @returns {boolean}
*/
CameraCust.prototype.checkCameraPermission = function () {
var hasPermission = android.content.pm.PackageManager.PERMISSION_GRANTED == context.checkSelfPermission(android.Manifest.permission.CAMERA);
return hasPermission;
};
/**
* 拍照
* @param {string} picPath 保存照片路径
*/
CameraCust.prototype.takePicture = function (picPath) {
var self = this;
this._camera.takePicture(
null,
null,
new android.hardware.Camera.PictureCallback({
onPictureTaken: function (data, camera) {
try {
var bitmap = android.graphics.BitmapFactory.decodeByteArray(data, 0, data.length);
var file = new java.io.File(picPath);
var fos = new java.io.FileOutputStream(file);
bitmap.compress(android.graphics.Bitmap.CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
toast('照片已保存: ' + file.getAbsolutePath());
} catch (e) {
toast('保存照片失败: ' + e.message);
} finally {
if (self._camera) {
self._camera.stopPreview();
self._camera.release();
}
}
}
})
);
};
/**
* 聚焦并拍照
* @param {string} picPath 保存照片路径
*/
CameraCust.prototype.takePictureWithFocus = function (picPath) {
var self = this;
this._camera.autoFocus(
new android.hardware.Camera.AutoFocusCallback({
onAutoFocus: function (success, camera) {
if (success) {
log('聚焦成功!');
// 在聚焦成功后拍照
self.takePicture(picPath);
} else {
log('聚焦失败');
}
}
})
);
};
return CameraCust;
})();
// 使用示例
var camera = new CameraCust();
camera.init();
camera.takePictureWithFocus('/sdcard/captured_image' + Date.now() + '.jpg');
分析
-
CameraCust 类:
- 构造函数:初始化
_camera
变量为null
。 - init 方法:检查摄像头权限,然后在 UI 线程中打开摄像头,并设置预览纹理,如果发生异常则显示错误消息。
- checkCameraPermission 方法:检查是否有摄像头权限。
- takePicture 方法:拍照方法,接收一个参数
picPath
表示保存照片的路径。在拍照时,使用_camera.takePicture
方法,传入一个PictureCallback
对象处理拍摄完成后的照片数据。在PictureCallback
的onPictureTaken
方法中,将照片数据解码为 Bitmap,并保存到指定路径。最后释放摄像头资源。 - takePictureWithFocus 方法:先聚焦再拍照的方法。调用
_camera.autoFocus
方法,传入一个AutoFocusCallback
对象处理聚焦结果。如果聚焦成功,则调用takePicture
方法拍照;否则记录聚焦失败日志。
- 构造函数:初始化
-
使用示例:
- 创建
CameraCust
的实例camera
。 - 调用
init
方法初始化摄像头。 - 调用
takePictureWithFocus
方法聚焦并拍照,保存照片到/sdcard/captured_image
目录下,文件名带有当前时间戳。
- 创建
没有回复内容