如果单击按钮,如何启动 SurfaceHolder.Callback() 事件?

How start SurfaceHolder.Callback() event if Button Clicked?

如果 Button 单击,我尝试启动相机的 SurfaceCallback,但我不能,如果我这样做了 Camera.setPreviewCallback() 尽管它在我从 [=15] 调用 SurfaceHolder.Callback() 时没有被调用=]方法如下代码所示

public class HeartRateMonitor extends ActionBarActivity {

private static final String TAG = "HeartRateMonitor";
private static SurfaceView preview = null;
private static SurfaceHolder previewHolder = null;
private static Camera camera ;
private static View image = null;
private static TextView text = null;
private static WakeLock wakeLock = null;
private static long startTime = 0;
static Context context;
static CircleButton cb ;
static int txt ;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    PlaceholderFragment  p = new PlaceholderFragment() ;
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.contain, p)
                .commit();
    }
    preview = (SurfaceView) findViewById(R.id.preview);
    previewHolder = preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    image = findViewById(R.id.image);
    text = (TextView) findViewById(R.id.text);
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNotDimScreen");
    HeartRateMonitor.context = getApplicationContext();
}


 class PlaceholderFragment extends Fragment implements View.OnClickListener {
     // this Fragment for Circular Button .
    View rootView ;
    public PlaceholderFragment() {
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.start, container, false);
        cb = (CircleButton) rootView.findViewById(R.id.startButton);
        cb.setImageResource(R.drawable.start);
        cb.isClickable();
        cb.findViewById(R.id.startButton).setOnClickListener(this);
        return rootView;
    }
    @Override
    public void onClick(View v) {
       // Toast.makeText(getActivity(), "Button clicked", Toast.LENGTH_SHORT).show();
        cb.setImageResource(R.drawable.stop);
        start();
    }
}


public void start(){
    // here i want start preview .
}


@Override
protected void onResume() {
    super.onResume();
    wakeLock.acquire();
    camera = Camera.open();
    startTime = System.currentTimeMillis();
}

@Override
public void onPause() {
    super.onPause();
    wakeLock.release();
    camera = null;
}


private static PreviewCallback previewCallback = new PreviewCallback() {

    @Override
    public void onPreviewFrame(byte[] data, Camera cam) {
      // process preview data here .
    }
};



private static SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        try {
            camera.setPreviewDisplay(previewHolder);
            camera.setPreviewCallback(previewCallback);
        } catch (Throwable t) {
        }
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Camera.Parameters parameters = camera.getParameters();
        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        Camera.Size size = getSmallestPreviewSize(width, height, parameters);
        if (size != null) {
            parameters.setPreviewSize(size.width, size.height);
        }
        camera.setParameters(parameters);
        camera.startPreview();
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // Ignore
    }
};




private static Camera.Size getSmallestPreviewSize(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;
}
}

如果您延迟调用 previewHolder.addCallback()surfaceCreated()surfaceChanged() 的实际事件将被触发为通常,只有你的回调不会被调用。

您可以随时开始预览创建并绑定预览表面(即在您致电 camera.setPreviewDisplay(previewHolder) 之后)。您可以 setPreviewCallback 只有当您需要它的数据时。您可以将 preview 设置为透明,或将其隐藏在其他视图后面。