【问题标题】:surfaceCreated is not called不调用surfaceCreated
【发布时间】:2023-03-28 22:53:02
【问题描述】:

我正在尝试将相机预览 (SurfaceView) 与显示屏上的按钮放在一起,但我得到的只是一个仅显示按钮的空白屏幕。如果我将 SurfaceView 设置为唯一内容(使用 setContentView(surfaceView) 则预览在屏幕上显示正常。我做错了什么?

提前致谢

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="0px"
        android:layout_weight="1">
        <SurfaceView
            android:id="@+id/camera_surface"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
        <Button 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:text="@string/trigger"
            android:id="@+id/trigger_picture_button" 
            android:layout_gravity="bottom" />
    </FrameLayout>
</LinearLayout>

我的活动:

public class CameraActivity extends Activity {

    private SurfaceView cameraPreview;
    private Button triggerPicture;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);

        cameraPreview = (SurfaceView) findViewById(R.id.camera_surface);
        triggerPicture = (Button) findViewById(R.id.trigger_picture_button);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        cameraPreview = new CameraPreview(this);
//      setContentView(cameraPreview);
    }

我的相机预览:

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder holder;
private Camera camera;

public CameraPreview(Context context) {
    super(context);
    holder = getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    camera = openFrontFacingCamera();
    try {
        camera.setPreviewDisplay(holder);
    } catch (IOException e) {
        camera.release();
        camera = null;
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
    camera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    Camera.Parameters parameters = camera.getParameters();
    parameters.setPreviewSize(width, height);
    parameters.set("orientation", "portrait");
    camera.setParameters(parameters);
    camera.startPreview();
}

private Camera openFrontFacingCamera() {
    // returns Camera.open(
}

【问题讨论】:

    标签: android surfaceview


    【解决方案1】:

    当您在布局中声明 SurfaceView 时,您告诉 Android 使用内置类。您需要做的是通过将 XML 中的 SurfaceView 替换为 your.package.name.CameraPreview 来使其使用您的类。

    另外一件事:你应该在CameraPreview 中添加一个构造函数,并接受参数ContextAttributeSet,否则布局充气器将无法充气你的类。你也不需要cameraPreview = new CameraPreview(this);这一行。

    【讨论】:

    • 谢谢你,马尔科姆。我之前尝试在 xml 中命名我的 CameraPreview 类,但没有帮助。我使用您的第二个建议解决了我的问题。当我删除行 cameraPreview = new CameraPreview(this) 时,预览开始工作。干得好:)
    【解决方案2】:

    当您的 onCreate() 是正确的时,您将使用新创建的从 xml 覆盖 cameraPreview,而您永远不会添加到任何布局(最后一行)。这意味着它永远不会膨胀,因此永远不会创建表面。

    【讨论】:

      【解决方案3】:

      也许答案有点晚了,但它确实对我有用。

      1、设置布局如下:

      <FrameLayout
              android:id="@+id/camera_preview"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:layout_weight="1"
              />
      
      <Button
              android:id="@+id/button_capture"
              android:text="Capture"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              />
      

      2、在onCreate中:

      // Create our Preview view and set it as the content of our activity.
          mPreview = new CameraPreview(this, mCamera);
          FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
          preview.addView(mPreview);
      

      3、在Manifest.xml中:

      android:screenOrientation="landscape"
      

      当然,不要忘记权限和功能。 希望对您有所帮助。

      【讨论】:

      • 这与surfaceView无关。
      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多