对于android事物的相机权限有问题,当我尝试运行简单的OpenCV应用程序时,此消息显示“似乎您的设备不支持相机(或它被锁定),应用程序将被关闭.Logcat - 在Android中过滤Studio向我显示OpenCV库已正确加载,所以我想问题可能是权限(你可以检查我的AndroidManifest文件)或者可能与OpenCV库的兼容性差...
此外,Logcat报告此错误:“E / JavaCameraView:Camera#0无法打开:无法连接到摄像头服务”
链接到源代码:https://github.com/mrAlex-dev/CameraPreview-AndroidThings
附:我正在使用:Raspberry Pi 3 B,Raspberry Pi Camera v1.3,Android Things - 0.4.1-devpreview,OpenCV-3.3.0-android-sdk ...
请有人帮助我,我是新手。
MainActivity.java的代码:
package com.example.alexd.camerapreviewandroidthings;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
public class MainActivity extends Activity implements CameraBridgeViewBase.CvCameraViewListener2 {
private static String TAG = "MainActivity";
JavaCameraView javaCameraView;
Mat mRgba;
BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch(status){
case BaseLoaderCallback.SUCCESS:{
javaCameraView.enableView();
break;
}
default:{
super.onManagerConnected(status);
break;
}
}
super.onManagerConnected(status);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view);
javaCameraView.setVisibility(SurfaceView.VISIBLE);
javaCameraView.setCvCameraViewListener(this);
}
@Override
protected void onPause(){
super.onPause();
if(javaCameraView!=null)
javaCameraView.disableView();
}
@Override
protected void onDestroy(){
super.onDestroy();
if(javaCameraView!=null)
javaCameraView.disableView();
}
@Override
protected void onResume(){
super.onResume();
if(OpenCVLoader.initDebug()){
Log.i(TAG, "OpenCV loaded successfully");
mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
else{
Log.i(TAG, "OpenCV not loaded");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_3_0, this, mLoaderCallBack);
}
}
@Override
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
}
@Override
public void onCameraViewStopped() {
mRgba.release();
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
return mRgba;
}
}
这是AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.alexd.camerapreviewandroidthings">
<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.camera2.*" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.things.permission.MANAGE_INPUT_DRIVERS" />
<application>
<uses-library android:name="com.google.android.things" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.IOT_LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
这是Logcat错误:
09-13 08:50:29.812 1880-1880/? E/cutils-trace: Error opening trace file: No such file or directory (2)
09-13 08:50:30.026 1880-1880/? E/memtrack: Couldn't load memtrack module (No such file or directory)
09-13 08:50:30.026 1880-1880/? E/android.os.Debug: failed to load memtrack module: -2
09-13 08:50:32.090 1899-1899/? E/cutils-trace: Error opening trace file: No such file or directory (2)
09-13 08:50:32.300 1899-1899/? E/memtrack: Couldn't load memtrack module (No such file or directory)
09-13 08:50:32.300 1899-1899/? E/android.os.Debug: failed to load memtrack module: -2
09-13 08:50:35.356 1913-1913/? E/cutils-trace: Error opening trace file: No such file or directory (2)
09-13 08:50:35.573 1911-1911/? E/memtrack: Couldn't load memtrack module (No such file or directory)
09-13 08:50:35.573 1911-1911/? E/android.os.Debug: failed to load memtrack module: -2
09-13 08:50:37.811 150-150/? E/libEGL: called unimplemented OpenGL ES API
09-13 08:50:37.811 150-150/? E/SurfaceFlinger: glCheckFramebufferStatusOES error 0
09-13 08:50:37.812 150-150/? E/SurfaceFlinger: got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot
09-13 09:00:00.843 412-429/system_process E/BatteryStatsService: no controller energy info supplied
09-13 09:00:00.848 412-429/system_process E/KernelWakelockReader: neither /proc/wakelocks nor /d/wakeup_sources exists
09-13 08:52:02.318 412-478/system_process E/TaskPersister: File error accessing recents directory (directory doesn't exist?).
09-13 08:51:58.902 155-155/? E/Camera2Client: notifyError: Error condition 0 reported by HAL, requestId -1
09-13 08:50:39.321 155-1838/? E/V4L2CameraHAL: virtual int v4l2_camera_hal::V4L2Camera::setupStreams(camera3_stream_configuration_t *):380: V4L2 only supports 1 stream configuration at a time (stream 0 is format 34, width 640, height 480, stream 1 is format 33, width 320, height 240).
09-13 08:50:39.321 155-1838/? E/Camera: int default_camera_hal::Camera::configureStreams(camera3_stream_configuration_t *):0: Failed to setup stream set
09-13 08:50:39.321 155-1838/? E/Camera3-Device: Camera 0: configureStreamsLocked: Set of requested inputs/outputs not supported by HAL
09-13 08:50:39.321 155-1838/? E/Camera3-Device: Camera 0: setUpRequestLocked: Can't set up streams: Invalid argument (-22)
09-13 08:50:39.321 155-1838/? E/Camera3-Device: Camera 0: convertMetadataListToRequestListLocked: Can't create capture request
09-13 08:50:39.321 155-1838/? E/Camera2-StreamingProcessor: startStream: Camera 0: Unable to set preview request to start preview: Invalid argument (-22)
09-13 08:50:39.321 155-1838/? E/Camera2Client: startPreviewL: Camera 0: Unable to start streaming preview: Invalid argument (-22)
09-13 08:50:39.262 162-1964/? E/FileSource: Failed to open file '/system/media/audio/ui/VideoRecord.ogg'. (No such file or directory)
09-13 08:50:39.262 162-1964/? E/GenericSource: Failed to create data source!
09-13 08:50:39.262 155-1838/? E/MediaPlayer: error (1, -2147483648)
09-13 08:50:39.266 162-1966/? E/FileSource: Failed to open file '/system/media/audio/ui/VideoStop.ogg'. (No such file or directory)
09-13 08:50:39.266 162-1966/? E/GenericSource: Failed to create data source!
android.permission.CAMERA
权限是一种危险的权限,通常需要用户在标准Android上在运行时授予权限。在Android Things中,这些权限是自动授予的,但仅限于设备启动时。您需要执行以下操作之一才能将该权限授予您的应用:
adb install -g <APK>
手动安装APK。此标志在安装时授予所有请求的权限,因此您可以避免重新启动。我正在使用CSI相机在Raspberry 3B上使用Android Things。当我使用Android Camera1 API尝试打开相机时,我发现了一些错误
Can't Connect Camera using Android Camera (1) API on Raspberry Pi running AndroidThings
所以我尝试使用Android Camera2 API。当我尝试创建预览和捕获2个流会话时出错。我发现这个issue:37130806
它说Raspberry Pi相机HAL是使用V4L2实现的。不幸的是,V4L2接口与Android HAL要求并不完全兼容。值得注意的是,V4L2并未正式支持同时配置多个流。
所以也许这就是问题所在
据我所知,android的东西目前不支持Graphic:硬件加速,因为它默认没有启用。根据问题
javaCameraView = (JavaCameraView)findViewById(R.id.java_camera_view);
javaCameraView.setVisibility(SurfaceView.VISIBLE);
javaCameraView.setCvCameraViewListener(this);
在设置SurfaceView时需要硬件评估。 check this它取决于OpenGL ES
因此,为了使其运行起来就是实现类似下面的内容。
mCameraThread = new HandlerThread("CameraBackground");
mCameraThread.start();
mCameraHandler = new Handler(mCameraThread.getLooper());
mCamera = RCamera.getInstance();
mCamera.initializeCamera(this, mCameraHandler, mOnImageAvailableListener);
takePicHandler = new Handler();
takePicHandler.post(runnable);
和处理程序和ImageReader.OnImageAvailableListener将是一样的
private Runnable runnable = new Runnable() {
@Override
public void run() {
Log.println(Log.INFO, "runnable", "running");
mCamera.takePicture();
takePicHandler.postDelayed(runnable, 0);
}
};
private ImageReader.OnImageAvailableListener mOnImageAvailableListener =
new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
// get image bytes
ByteBuffer imageBuf = image.getPlanes()[0].getBuffer();
final byte[] imageBytes = new byte[imageBuf.remaining()];
imageBuf.get(imageBytes);
image.close();
onPictureTaken(imageBytes);
}
};
这将适用于Android东西和RPI3,干杯!