我有一个Camera2 NDK代码可以打开相机并获取图像。
该代码可通过Android应用程序/服务正常运行,但是如果我将其编译并以可执行文件身份运行,则相机会打开,但不会得到任何帧。
有什么主意吗?有人成功做到了吗?
注意
注意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”状态还可以,但是我没有任何帧)
像素(对于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'
UPDATE2
我也使用msm8996 EVB(使用Android 7.1.1)对其进行了测试:
(1)我遇到了Pixel2之类的权限问题。
(2)我用su来运行它,并且修复了权限问题(相机已打开),但是我还没有得到任何图像。
答案 0 :(得分:1)
我没有看到您的代码。根据您的描述,您已正确完成了所有操作。如果添加以下内容,则应该可以使用。
#include <binder/ProcessState.h>
...
main()
{
...
android::ProcessState::self()->startThreadPool();
...
Camera open, AImageReader_new, etc ...
...
Close Camera
...
}
还将libbinder添加到Android.mk LOCAL_SHARED_LIBRARIES。
答案 1 :(得分:-1)
通常,NDK不支持Android shell可执行文件,因此您的设备SELinux策略可能会以某种方式阻止其使用。