Java SurfaceView没有';t显示摄像机
我试图在我的android应用程序中显示一个摄像头,但我得到的只是一个位于Java SurfaceView没有';t显示摄像机,java,android,Java,Android,我试图在我的android应用程序中显示一个摄像头,但我得到的只是一个位于SurfaceView的黑盒子 我使用的是这个简单的XML布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" an
SurfaceView
的黑盒子
我使用的是这个简单的XML布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.lazylayer.photoshoot.MainActivity">
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
通过这项活动:
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
SurfaceView surfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView)findViewById(R.id.surface_view);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try{
CameraManager cameraManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
String[] cameras = cameraManager.getCameraIdList();
cameraManager.openCamera(cameras[0], deviceCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
CameraDevice.StateCallback deviceCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
try {
List<Surface> surfaceList = Collections.singletonList(surfaceView.getHolder().getSurface());
camera.createCaptureSession(surfaceList, sessionCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onDisconnected(CameraDevice camera) {}
@Override
public void onError(CameraDevice camera, int error) {}
};
CameraCaptureSession.StateCallback sessionCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {}
};
}
public类MainActivity扩展AppCompatActivity实现SurfaceHolder.Callback{
表面视图表面视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView=(surfaceView)findViewById(R.id.surface\U视图);
}
@凌驾
已创建的公共空白表面(表面持有人){
试一试{
CameraManager CameraManager=(CameraManager)getSystemService(Context.CAMERA_服务);
String[]cameras=cameraManager.getCameraIdList();
openCamera(cameras[0],deviceCallback,null);
}捕获(CameraAccessE异常){
e、 printStackTrace();
}
}
@凌驾
public void surfacechange(SurfaceHolder持有者,int格式,int宽度,int高度){}
@凌驾
公开作废表面作废(表面持有人){}
CameraDevice.StateCallback deviceCallback=新建CameraDevice.StateCallback(){
@凌驾
打开公共空间(摄像头副摄像头){
试一试{
List surfaceList=Collections.singletonList(surfaceView.getHolder().getSurface());
createCaptureSession(surfaceList,sessionCallback,null);
}捕获(CameraAccessE异常){
e、 printStackTrace();
}
}
@凌驾
已断开连接的公共无效(摄像头设备摄像头){}
@凌驾
public void onError(CameraDevice camera,int error){}
};
CameraCaptureSession.StateCallback sessionCallback=新建CameraCaptureSession.StateCallback(){
@凌驾
未配置公共void(CameraCaptureSession会话){
}
@凌驾
配置文件的公共无效(CameraCaptureSession会话){}
};
}
以下是在我的手机上运行应用程序时显示的内容:
我能够通过使用
FrameLayout
而不是SurfaceView来解决这个问题
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/camera_view">
</FrameLayout>
您在清单上添加权限了吗?我有