Android Camera2 可执行文件获取帧失败
Android Camera2 executable failed to get frames
我有一个 Camera2 NDK 代码可以打开相机并获取图像。
代码通过 Android Application/Service 工作正常,但如果我编译并 运行 它作为可执行文件打开相机,但我没有得到任何帧。
有什么想法吗?有人成功了吗?
注意
- 我通过 "AImageReader_new"
创建了自己的 AImageReader
- 我通过 "AImageReader_getWindow"
创建了自己的 ANativeWindow
注意 2(已添加)
调用有点不同
对于 Android Application/Service 调用如下:
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'
更新2
我还使用 msm8996 EVB(使用 Android 7.1.1)对其进行了测试:
(1) 我遇到像 Pixel2 一样的权限问题。
(2) 我 运行 它与 su 和权限问题修复(相机打开),但我已经没有得到任何图像。
一般来说,NDK 不支持 Android shell 可执行文件,因此您的设备 SELinux 策略可能以某种方式阻止了它的使用。
我没有看到你的代码。从你的描述来看,你做的一切都是对的。如果添加以下内容,它应该可以工作。
#include <binder/ProcessState.h>
...
main()
{
...
android::ProcessState::self()->startThreadPool();
...
Camera open, AImageReader_new, etc ...
...
Close Camera
...
}
同时将 libbinder 添加到 Android.mk LOCAL_SHARED_LIBRARIES。
我有一个 Camera2 NDK 代码可以打开相机并获取图像。
代码通过 Android Application/Service 工作正常,但如果我编译并 运行 它作为可执行文件打开相机,但我没有得到任何帧。
有什么想法吗?有人成功了吗?
注意
- 我通过 "AImageReader_new" 创建了自己的 AImageReader
- 我通过 "AImageReader_getWindow" 创建了自己的 ANativeWindow
注意 2(已添加)
调用有点不同
对于 Android Application/Service 调用如下:
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'
更新2
我还使用 msm8996 EVB(使用 Android 7.1.1)对其进行了测试:
(1) 我遇到像 Pixel2 一样的权限问题。
(2) 我 运行 它与 su 和权限问题修复(相机打开),但我已经没有得到任何图像。
一般来说,NDK 不支持 Android shell 可执行文件,因此您的设备 SELinux 策略可能以某种方式阻止了它的使用。
我没有看到你的代码。从你的描述来看,你做的一切都是对的。如果添加以下内容,它应该可以工作。
#include <binder/ProcessState.h>
...
main()
{
...
android::ProcessState::self()->startThreadPool();
...
Camera open, AImageReader_new, etc ...
...
Close Camera
...
}
同时将 libbinder 添加到 Android.mk LOCAL_SHARED_LIBRARIES。