Your code does not set a preview target with either Camera.setPreviewDisplay or Camera.setPreviewTexture.
That's required by the API for preview to operate, though many devices unfortunately don't enforce this (which is a problem when you then run your app on a strict device).
If you don't want to draw a preview, then just create a dummy SurfaceTexture:
Camera cam = Camera.Open();
Camera.Parameters p = cam.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
SurfaceTexture dummy = new SurfaceTexture(1);
cam.setPreviewTexture(dummy);
cam.startPreview();
And make sure that you don't let the dummy SurfaceTexture object get garbage-collected while the camera is running.
That said, the new torch API in Marshmallow is very simple to use and does not require the camera permission, so I recommend you use it whenever possible.