【问题标题】:SurfaceView is swapping the red and blue Google Glass camera colorsSurfaceView 正在交换红色和蓝色的 Google Glass 相机颜色
【发布时间】:2014-07-08 15:48:02
【问题描述】:

由于某种奇怪的原因,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;
    }
}

}

任何想法为什么这种颜色交换?

【问题讨论】:

  • 你没有考虑在 GitHub 上打开一个 issue 吗?
  • 嗨,Alex,我也在这里找不到答案,最终有人会遇到相同或相似的问题,对此的答案可能会很有用。到目前为止,我已经搜索并测试了许多解决方案,但都没有成功。我也不是 Android 专家。
  • 我没有说“在 GitHub 上寻找答案”。但也许在关注 OpenQuartz 项目的人中(现在 32 人)有一些人有答案,或者可以找到答案,但没有订阅 SO [google-glass]
  • 好的,好的,我会听从你的建议的。

标签: android camera google-glass google-gdk


【解决方案1】:

我遇到了同样的问题,这让我发疯了。经过大量努力,我发现由于某种奇怪的原因,当布局仅包含 FrameLayout 时,会发生这种情况,该 FrameLayout 包含相机的 SurfaceView 而没有其他布局元素。 就我而言,我在 FrameLayout 上添加了空的 TextView 并解决了。奇怪但有效。 (最终我使用这个 TextView 来显示文本,所以这就是 style 和 location 属性的原因)

<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="" />

【讨论】:

  • 哥们,你太棒了!这是一个奇怪的工作,但绝对有效!谢谢!
【解决方案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"
     />

【讨论】:

  • 你加载这个布局就像一个 ContentView?
  • 是的,这只是布局的一部分。我将屏幕中的这个 VideoView 与 findViewById 相关联。此示例用于播放视频。在您的情况下,您可能需要将 VideoView 更改为 Surface View。
  • @Euber 说真的,这让我大吃一惊。添加了 40px 的边距,它成功了!谢谢你
【解决方案3】:

您是否将 Activity 的 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);
}

【讨论】:

  • 超级!我会试试的,让你知道!
  • 实际上,我昨天一直在与此作斗争,出于某种原因(我想获得更多信息来回答你)我的屏幕只是冻结并且完整的 GGlass 直到我需要硬重置的地步。
  • 可能是您在主 (UI) 线程上做的工作过多。您也可能没有以正确的方式启动和停止相机预览。
  • 所以,我让它工作了,但是颜色仍然被交换了。我认为问题直接来自“cameraPreview”对象,而不是来自内容视图。
【解决方案4】:

我遇到了同样的问题,但不仅仅是在相机视频预览上。 我解决了。 我将 android:hardwareAccelerated="true" 添加到 androidmanifest.xml 活动部分。 现在工作正常。 (对不起,我的英语不好。)

【讨论】:

    【解决方案5】:

    这个问题可能是相关的:

    Glass camera preview display is garbled

    【讨论】:

    • 他已经明确提到,图像预览显示不错,只是R和B通道互换了。所以答案是不相关的。
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2014-08-26
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多