Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SurfaceView Android应用完整的摄像头功能_Android_Xml_Camera_Surfaceview - Fatal编程技术网

如何使用SurfaceView Android应用完整的摄像头功能

如何使用SurfaceView Android应用完整的摄像头功能,android,xml,camera,surfaceview,Android,Xml,Camera,Surfaceview,我正在使用Surface View Camera在Android上进行一个项目。我想在相机的表面视图上显示一些按钮和框架,并使其成为相机捕捉功能 现在,我已经完成了SurfaceView以查看相机上方的帧图像,但当我添加按钮时,它会显示在曲面视图之外。以下是我的主要代码: //这是我的预览emo.java package com.commonsware.android.camera; import android.app.Activity; import andro

我正在使用Surface View Camera在Android上进行一个项目。我想在相机的表面视图上显示一些按钮和框架,并使其成为相机捕捉功能

现在,我已经完成了SurfaceView以查看相机上方的帧图像,但当我添加按钮时,它会显示在曲面视图之外。以下是我的主要代码:

//这是我的预览emo.java

    package com.commonsware.android.camera;

     import android.app.Activity;
     import android.content.pm.ActivityInfo;
     import android.hardware.Camera;
     import android.os.Bundle;
     import android.util.Log;
     import android.view.LayoutInflater;
     import android.view.SurfaceHolder;
     import android.view.SurfaceView;
     import android.view.View;
     import android.view.ViewGroup.LayoutParams;
     import android.widget.Toast;

     public class PreviewDemo extends Activity {
     private SurfaceView preview=null;
     private SurfaceHolder previewHolder=null;
     private Camera camera=null;
     private boolean inPreview=false;
     private boolean cameraConfigured=false;
     LayoutInflater inflater = null;

     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    preview=(SurfaceView)findViewById(R.id.preview);
    previewHolder=preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    inflater = LayoutInflater.from(getBaseContext());
    View view = inflater.inflate(R.layout.overlay, null);
    LayoutParams layoutParamsControl= new LayoutParams(LayoutParams.MATCH_PARENT,   LayoutParams.MATCH_PARENT);
    this.addContentView(view, layoutParamsControl);
     }

     @Override
    public void onResume() {
     super.onResume();

    camera=Camera.open();
    startPreview();
    }

    @Override
    public void onPause() {
    if (inPreview) {
      camera.stopPreview();
    }

    camera.release();
    camera=null;
    inPreview=false;

    super.onPause();
    }

    private Camera.Size getBestPreviewSize(int width, int height,
                                         Camera.Parameters parameters) {
    Camera.Size result=null;

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
      if (size.width<=width && size.height<=height) {
        if (result==null) {
          result=size;
        }
        else {
          int resultArea=result.width*result.height;
          int newArea=size.width*size.height;

          if (newArea>resultArea) {
            result=size;
          }
        }
       }
     }

    return(result);
     }

    private void initPreview(int width, int height) {
    if (camera!=null && previewHolder.getSurface()!=null) {
      try {
        camera.setPreviewDisplay(previewHolder);
      }
      catch (Throwable t) {
        Log.e("PreviewDemo-surfaceCallback",
              "Exception in setPreviewDisplay()", t);
        Toast
          .makeText(PreviewDemo.this, t.getMessage(), Toast.LENGTH_LONG)
          .show();
      }

      if (!cameraConfigured) {
        Camera.Parameters parameters=camera.getParameters();
        Camera.Size size=getBestPreviewSize(width, height,
                                            parameters);

        if (size!=null) {
          parameters.setPreviewSize(size.width, size.height);
          camera.setParameters(parameters);
          cameraConfigured=true;
        }
      }
      }
      }

      private void startPreview() {
      if (cameraConfigured && camera!=null) {
      camera.startPreview();
      inPreview=true;
      }
     }

     SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
     public void surfaceCreated(SurfaceHolder holder) {
      // no-op -- wait until surfaceChanged()
     }

     public void surfaceChanged(SurfaceHolder holder,
                               int format, int width,
                               int height) {
      initPreview(width, height);
       startPreview();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
      // no-op
     }
    };
  }
package com.commonware.android.camera;
导入android.app.Activity;
导入android.content.pm.ActivityInfo;
导入android.hardware.Camera;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;
导入android.view.view;
导入android.view.ViewGroup.LayoutParams;
导入android.widget.Toast;
公共类PreviewDemo扩展活动{
private SurfaceView preview=null;
private SurfaceHolder previewHolder=null;
私人摄像机=空;
private boolean inPreview=false;
私有布尔值cameraConfigured=false;
排气充气机=空;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向);
预览=(SurfaceView)findViewById(R.id.preview);
previewHolder=preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE类型推送缓冲区);
充气器=LayoutInflater.from(getBaseContext());
视图=充气机充气(R.layout.overlay,空);
LayoutParams layoutParamsControl=新的LayoutParams(LayoutParams.MATCH\u父级,LayoutParams.MATCH\u父级);
this.addContentView(视图,layoutParamsControl);
}
@凌驾
恢复时公开作废(){
super.onResume();
camera=camera.open();
startPreview();
}
@凌驾
公共无效暂停(){
如果(审查){
camera.stopPreview();
}
相机。释放();
摄像机=零;
inPreview=false;
super.onPause();
}
私人相机。大小getBestPreviewSize(整数宽度,整数高度,
摄像机(参数){
Camera.Size结果=null;
对于(Camera.Size:parameters.getSupportedPreviewSizes()){

如果(size.width我希望我已经理解了您的问题。但是,如果您希望在框架的曲面视图上方显示“捕获”按钮,请尝试以下代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/frame"
android:orientation="vertical" >

<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Capture" />

<SurfaceView
    android:id="@+id/surface_camera"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:background="@drawable/frame"
    android:clickable="true"
    android:layout_below="@id/button1"
    android:longClickable="false" />

</RelativeLayout>

我希望我理解正确。 您正在尝试添加一个覆盖,该覆盖将在视频预览的顶部显示按钮。 为此,您需要使用相对布局(默认情况下)将视图放置在彼此的顶部。 放置SurfaceView后,您可以放置任何您喜欢的视图,并使用其属性在屏幕上按您想要的方式对齐它

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="fill_vertical">

<SurfaceView
    android:id="@+id/surface_camera"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:layout_weight="1"
    android:background="@drawable/frame"
    android:clickable="true"
    android:longClickable="false"
    android:padding="@android:dimen/thumbnail_height" />

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    // PUT YOUR BUTTONS HERE
</FrameLayout

</RelativeLayout>

//把你的钮扣放在这里

按钮不应该放在SurfaceView之后吗?谢谢,我可以在SurfaceView中再添加一个按钮吗?确实可以。只需删除相对布局中的android:layout_=“@id/button1”标记。我的错误。因为我们改为RelativeLayout,所以表面视图的高度应该是“wrap_content”或“fill_parent”.我已经编辑了答案。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="fill_vertical">

<SurfaceView
    android:id="@+id/surface_camera"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center_horizontal"
    android:layout_weight="1"
    android:background="@drawable/frame"
    android:clickable="true"
    android:longClickable="false"
    android:padding="@android:dimen/thumbnail_height" />

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    // PUT YOUR BUTTONS HERE
</FrameLayout

</RelativeLayout>