【问题标题】:Android Camera2 executable failed to get framesAndroid Camera2 可执行文件无法获取帧
【发布时间】:2018-10-08 22:17:33
【问题描述】:

我有一个 Camera2 NDK 代码来打开相机并获取图像。

代码通过 Android 应用程序/服务正常工作,但如果我将其编译并作为可执行文件运行,相机会打开但我没有得到任何帧。

有什么想法吗?有人成功了吗?


注意

  1. 我通过“AImageReader_new”创建了自己的 AImageReader
  2. 我通过“AImageReader_getWindow”创建自己的 ANativeWindow

注释2(添加)

调用有点不同

对于 Android 应用程序/服务,调用如下:

public void onCreate() {
       JNIBridge.startPreview(null);
}
public void onDestroy() {
       JNIBridge.stopPreview();
}

对于可执行文件:

int main()
{
Java_com_y30_nativecamera2_JNIBridge_startPreview(nullptr, nullptr, nullptr);

for(int i = 0; i < 10; ++i)
{
    std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}

Java_com_y30_nativecamera2_JNIBridge_stopPreview(nullptr, nullptr);

return 0;
}

更新

我在多台 Android 设备上再次对其进行了测试。

S8/S9+ (Andorid 8.0.0) 可以重现。(“ACameraManager_openCamera”状态正常,但我没有收到任何帧)

Pixel(使用 Android 9)方法“ACameraManager_openCamera”失败。

10-09 10:45:04.933   933  1592 I CameraService: CameraService::connect call (PID -1 "", camera ID 0) for HAL version default and Camera API version 2
10-09 10:45:04.933   933  1592 W ServiceManager: Permission failure: android.permission.CAMERA from uid=2000 pid=19606
10-09 10:45:04.933   933  1592 E CameraService: Permission Denial: can't use the camera pid=19606, uid=2000
10-09 10:45:04.933 19606 19606 E ACameraManager: openCamera: connect camera device failed: Status(-8): '1: validateClientPermissionsLocked:906: Caller "" (PID 2000, UID 19606) cannot open camera "0" without camera permission'

更新2

我还使用 msm8996 EVB(使用 Android 7.1.1)对其进行了测试:

(1) 我遇到了像 Pixel2 这样的权限问题。

(2) 我用 su 运行它并修复了权限问题(相机打开)但我已经没有得到任何图像。

【问题讨论】:

  • 不确定这是否有帮助:sisik.eu/blog/android/ndk/camera 但您所写的问题并没有提供足够的细节来说明发生了什么问题,因为您声明 code work fine via Android Application/Service, but if I compile and run it as executable 在 Android 中没有多大意义语境。什么可执行文件?
  • 错误cannot open camera "0" without camera permission 听起来很清楚 - 好像您没有获得打开相机的权限。
  • @DmitriiZ。您完全正确地使用 Pixel2(使用 Android 9)外壳。但是其他设备呢? (我在其他设备上没有这样的日志......)
  • @DmitriiZ。也可能与Android 9有关?

标签: android android-ndk android-camera2


【解决方案1】:

我还没有看到你的代码。从你的描述来看,你做的一切都是对的。如果您添加以下内容,它应该可以工作。

#include <binder/ProcessState.h>

...
main()
{
...
    android::ProcessState::self()->startThreadPool();
...
    Camera open, AImageReader_new, etc ...
...
    Close Camera
...
}

还将 libbinder 添加到 Android.mk LOCAL_SHARED_LIBRARIES。

【讨论】:

  • 你说得对!经过测试并与三星 S8/S9+ (Android 8) 配合使用。
  • 对。 NDK 没有活页夹。由于您是在 AOSP 内部构建的,因此使用 binder API 没有问题。如果您想使用纯 NDK,则必须等待将来的 Android 版本支持 ABinderProcess_startThreadPool()。
【解决方案2】:

一般而言,NDK 不支持 Android shell 可执行文件,因此您的设备 SELinux 政策可能会以某种方式阻止其使用。

【讨论】:

  • (1) NDK 支持 shell 可执行文件!你可以用“include $(BUILD_EXECUTABLE)”编译它,推送到“/data/local/tmp/”并运行它。
  • (2) 我认为 SELinux 不是问题。一种。我比较了日志,没有看到任何 SELinux 日志 [cat log.log | grep 'avc:']。 (2) 代码相同!我不会尝试打开“/dev/videoX”之类的东西...
  • (3) 相机打开了。 (也许与表面有关?)
  • "include $(BUILD_EXECUTABLE)" 不是 NDK 构建命令,它是 Android 平台构建的一部分,它不是使用 Android Studio 或 cmake(或 ndk-建造)。 NDK 或 SDK 不以任何直接方式支持 Android 平台构建中构建的可执行文件;一些 API 可能有效,而另一些可能无效。
  • (1) “不是 NDK 构建命令” - 它是正常 ndk-build 的一部分(您可以查看 corochann.com/...) (2) “某些 API 可能有效,而其他 API 可能无效” - 你对的,因为到了exe一个。没有应用程序上下文(在这个 api 中你不需要它) b。权限 - 与 App 相比(直到 Android 9,我认为它没有任何问题......) c。用户界面 API。 (3) "Android Studio or cmake (or ndk-build)" - Android Studio 使用使用 cmake 或 ndk-build 的 gradle。
猜你喜欢
  • 2015-02-14
  • 2018-05-31
  • 2013-09-09
  • 2014-11-11
  • 2020-08-28
  • 2022-01-14
  • 1970-01-01
  • 2015-06-07
  • 2017-01-19
相关资源
最近更新 更多