使用 Autojs 调用摄像头并拍照-源码区论坛-autojs-五云学习

使用 Autojs 调用摄像头并拍照

简介

使用 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 目录下,文件名带有当前时间戳。
请登录后发表评论

    没有回复内容