是否可以在 Android 设备上使用本机相机应用程序以编程方式拍照而无需实际点击拍摄按钮?

Is it possible to programmatically take photo with native Camera app on Android device without physically tapping the capture button?

正如标题所说,是否可以在 Android 设备上以编程方式 interact/configure 使用本机相机应用程序?

例如,我正在尝试让本机相机应用无需触摸拍摄按钮即可拍照。我不想在相机应用程序中使用 internal-timer 功能,因为这也需要对按钮进行物理触摸。

简单地说,我想知道是否可以在不触摸拍摄按钮的情况下拍照。

预先感谢您的回复。

is it possible to programmatically interact/configure with native Camera app on Android device?

不是来自普通的 Android 应用。

另外,请注意,有数千种 Android 设备型号。这些设备模型有数百种不同的 "native Camera app" 实现,因为设备制造商通常会实现自己的实现。你的问题暗示你认为只有一个"native Camera app",事实并非如此。

对于单个设备型号,或者可能是一个具有 root 权限的设备的密切相关系列,您也许可以通过模拟用户输入来解决问题。然而,无数的相机应用程序意味着您需要为每个应用程序制定不同的规则。

此外,如果您只关心自己的设备,您可以使用 uiautomator 测试系统来控制第三方应用程序,但这需要连接到您的开发机器,因为测试是 运行 从那里开始。

有可能。 "native Camera app"就不用管了,直接用Camera/Camera2API

前段时间我尝试做一个后台服务定时拍照,检测人脸并测量眼睛距离,以防止我的小狗看标签太近,但是失败了,因为标签相机角度太窄无法拍摄她所有脸。

我在这里发布了这个应用程序的一部分(这段代码使用了 depricated Camera 界面。它被 Camera2 界面取代,因为 API21):

public void onCreate() {
    super.onCreate();
    mContext = getApplicationContext();
    surfaceTexture = new SurfaceTexture(0);
}

public void takePictire() {
    Camera cam = openFrontCamera(mContext);
    if (cam != null) {
        try {
            cam.setPreviewTexture(surfaceTexture);
            cam.startPreview();
            cam.takePicture(null, null, mPicture);
        } catch (Exception ex) {
            Log.d(LOG_TAG, "Can't take picture!");
        }
    }
}

private static Camera.PictureCallback mPicture = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        BitmapFactory.Options bfo = new BitmapFactory.Options();
        bfo.inPreferredConfig = Bitmap.Config.RGB_565;
        Bitmap bitmap = BitmapFactory.decodeStream(new ByteArrayInputStream(data), null, bfo);
        // Eye distance detection here and saving data
        camera.stopPreview();
        camera.release();
    }
};

/* Check if this device has a camera */
private static Camera openFrontCamera(Context context) {
    try {
        boolean hasCamera = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
        if (hasCamera) {
            int cameraCount = 0;
            Camera cam = null;
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            cameraCount = Camera.getNumberOfCameras();
            for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
                Camera.getCameraInfo(camIdx, cameraInfo);
                if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                    try {
                        cam = Camera.open(camIdx);
                    } catch (RuntimeException e) {
                        Log.e(LOG_TAG, "Camera failed to open: " + e.getLocalizedMessage());
                    }
                }
            }

            return cam;
        }
    } catch (Exception ex) {
        Log.d(LOG_TAG, "Can't open front camera");
    }

    return null;
}

一些附加信息。要使用此代码,您的应用应在 AndroidManifest.xml:

中拥有相机权限
<uses-permission android:name="android.permission.CAMERA" />

是的,即使在没有框架的背景下,您也可以在没有任何用户输入的情况下捕获图像。看看 here 。希望对您有所帮助!