由于一些奇怪的原因,surfaceView显示的图像很好,但红色和蓝色通道交换。我使用的代码与Github project中的代码基本相同,但有一些细微的变化。
我使用它的代码是:
public class CameraView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder surfaceHolder = null;
private Camera camera = null;
public CameraView(Context context) {
super(context);
surfaceHolder = this.getHolder();
surfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
Parameters parameters = camera.getParameters();
parameters.setPreviewFpsRange(30000, 30000);
camera.setParameters(parameters);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (camera != null){ // Start the preview for surfaceChanged
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
this.releaseCamera();
}
camera.startPreview();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
this.releaseCamera(); // Do not hold the camera during surfaceDestroyed - view should be gone...
}
public void releaseCamera() {
if (camera != null) {
camera.release();
camera = null;
}
}
}
为什么这种颜色交换的想法?
答案 0 :(得分:6)
我有同样的问题,它让我发疯了。经过大量的努力,我发现,由于某些奇怪的原因,当布局只包含FrameLayout时,会发生这种情况,而FrameLayout只包含相机的SurfaceView而没有其他布局元素。 在我的情况下,我在FrameLayout上添加了空TextView并解析了它。奇怪但工作。 (最终我用这个TextView显示文本,所以这就是样式和位置属性的原因)
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="${relativePackage}.${activityClass}"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/CameraView" />
<TextView
android:id="@+id/status_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dip"
android:layout_gravity="center_horizontal|top"
android:padding="5dip"
android:textColor="#000000"
android:text="" />
答案 1 :(得分:2)
我遇到了同样的问题。 我找到的解决方法是在屏幕上放置一个边距。
dimens.xml
<dimen name="glass_video_margin">1px</dimen>
layout_activity.xml
<VideoView
android:id="@+id/vid_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/glass_video_margin"
/>
答案 2 :(得分:0)
您是否将活动的ContentView设置为CameraView?如果是这样,则会发生此问题。我在下面的代码中遇到了同样的问题。
@Override
protected void onResume() {
super.onResume();
cameraPreview = new CameraPreview(this);
// setUpCameraPreview();
setContentView(cameraPreview);
}
稍后我使用以下内容创建了activity_main.xml
。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
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:background="@android:color/black"
tools:context="com.arun.camera.CustomCamera">
<FrameLayout
android:id="@+id/cameraPreview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
然后我在我的onCreate
中创建了相机预览,如下所示,所以事情就好了。我的onCreate
现在看起来如下。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
previewLayout = (FrameLayout) this.findViewById(R.id.cameraPreview);
cameraPreview = new CameraPreview(this);
previewLayout.addView(cameraPreview);
}
答案 3 :(得分:0)
我遇到了同样的问题,但不仅仅是相机视频预览。 我解决了 我在androidmanifest.xml活动部分添加了android:hardwareAccelerated =“true”。 现在工作正常。 (对不起,我的英文不好。)
答案 4 :(得分:-1)
这个问题可能有关: