Android: 在库项目中访问 camera.startPreview()

Android: Accessing camera.startPreview() in library project

我是 Android 的新手,但必须对项目进行一些相当复杂的编程。 我们想为 Unity 项目编写一个 Android 插件,因为我们需要测量用户的心率。代码本身已经编写完成,并且可以在应用程序的上下文中正常运行。我们现在必须在库项目的上下文中重写它。

我已经想出了如何在没有 GUI 元素的情况下访问 getSystemService()(我没有 GUI 元素,因为它是一个库而不是一个应用程序)。

现在的问题是,当我调用 camera.startPreview() 时没有任何反应。我尝试执行以下操作:

public HeartRateMeasurement(Context c) {
    context = c;

    SurfaceView surfaceView = new SurfaceView(c);
    SurfaceHolder holder = surfaceView.getHolder();
    holder.addCallback(this);
    surfaceCreated(holder);

}

在 surfaceCreated 内部我设置了一些参数(比如闪光模式 "torch")然后调用

camera.setPreviewDisplay(holder);
camera = open();

以及何时应该开始测量心率(发生在单击按钮时)

camera.startPreview();

这一切(除了我自己添加的构造函数之外)在应用程序内部完成时就像魅力一样工作,但不是在库中 - 没有抛出异常,但闪光灯没有打开。在调试信息中他告诉我 "D/Camera: app passed NULL surface",这并不奇怪,因为没有 layout/surface.

我的清单如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tudarmstadt.heartrateplugin">
<application
    android:allowBackup="true"
    android:label="@string/app_name"
    android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
<uses-feature android:name="android.hardware.Sensor" />
</manifest>

有什么方法可以使 startPreview() 正常工作?

将图面附加到主布局。

rootlayout.addView(surfaceView)

最新的API防止程序员在不显示的情况下抓取数据。

编辑 为了获得根布局,你必须使用这个:

mRootWindow = getWindow();
mDecorView = mRootWindow.getDecorView();
mRootView = mDecorView.findViewById(android.R.id.content);