Начиная новый ответ, надеюсь, будет более понятным. Опять же, я думаю, что основной проблемой является количество вещей, которые вы делаете в onCreate против onResume.
Я думаю, что основная проблема, с которой вы столкнулись, заключается в том, что некоторые части жизненного цикла представления / действия должны пройти свой курс, прежде чем вы начнете работать с SurfaceView и начнете с ним предварительную просмотр.
Я не уверен в этом, но вот разбивка различных мест, где я имею дело с различными камерами и видом с поверхности в приложении дополненной реальности, которое работает:
onCreate()
{
// just set content view. do nothing with the camera or surfaceView yet
setContentView(R.layout.main);
}
onResume()
{
// open camera
mCamera = Camera.open();
// init surface view
sv = (SurfaceView)this.findViewById(R.id.SurfaceView01);
mHolder = sv.getHolder();
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mHolder.setSizeFromLayout();
mHolder.addCallback(this);
}
surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
mCamera.setPreviewDisplay(holder);
// set any cam params you need...
mCamera.startPreview();
}
Попробуйте реструктурировать свой код, чтобы сделать подобное. Мои глаза потемнели, пытаясь подсчитать, где NPE происходило из вашего источника, но я думаю, что есть несколько проблем:
- вы, кажется, пытаетесь получить ссылку на вид поверхности ДО того, как вы вызвали setContentView ()
- вы непосредственно вызываете метод surfaceCreated, а не позволяете ему вызываться с помощью обратного вызова.
Надеюсь, это поможет. Мы выясним это еще!