2015-08-05 4 views
0

Привет, Я разрабатываю приложение с функцией Camera с помощью SurfaceView. Я хочу сделать снимок при создании поверхности.Выполнение фото в android

В методе onCreateView моего фрагмента инициализировано все, что мне нужно.

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     view = inflater.inflate(R.layout.game_one_start_fragment, container, false); 

     initWidgets(view);  
     return view; 

    } 

В initWidgets() метод инициализации объекта SurfaceView, как показано ниже

mSurfaceView = (SurfaceView) view.findViewById(R.id.game_action_surfaceview); 
mSurfaceHolder = mSurfaceView.getHolder(); 

В OnResume() Способ получения объекта surfaceHolder.

@Override 
    public void onResume() { 
     super.onResume(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     safeCameraOpen(Camera.CameraInfo.CAMERA_FACING_BACK); 

    } 

safeCameraOpen() я следовал Android Developer link. Используется тот же код, что и упомянутый.

surfaceHolder.callback используется как ниже

@Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     mCamera.startPreview(); 

    } 


    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

     try { 
//to set the picture orientation 
      setCameraDisplayOrientation(getActivity(), findFrontFacingCameraID(), mCamera); 
      mCamera.startPreview(); 
      mCamera.setPreviewDisplay(holder); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } 

     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.getSupportedPreviewSizes(); 

     mCamera.setParameters(parameters); 


    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 

Я хочу, чтобы сделать снимок, когда фрагмент загружен.

Я попытался использовать методы жизненного цикла onViewCreated(), onResume() и onStart(). В них я использовал (метод mCamera объект создан и инициализирован в safeCameraOpen())

mCamera.takePicture(null,null,mPictureCallback); 

следующую строку Если бы я попытался в упомянутых методов жизненного цикла, я получаю следующее сообщение об ошибке аварии.

java.lang.RuntimeException: takePicture failed 
      at android.hardware.Camera.native_takePicture(Native Method) 
      at android.hardware.Camera.takePicture(Camera.java:1266) 
      at android.hardware.Camera.takePicture(Camera.java:1211) 
      at com.gaming.fragment.GameOneStartFragment.snapPicture(GameOneStartFragment.java:76) 
      at com.gaming.fragment.GameOneStartFragment.surfaceCreated(GameOneStartFragment.java:284) 
      at android.view.SurfaceView.updateWindow(SurfaceView.java:572) 
      at android.view.SurfaceView.access$000(SurfaceView.java:86) 
      at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:175) 
      at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1897) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1019) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5725) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
      at android.view.Choreographer.doFrame(Choreographer.java:544) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5086) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 

Но, когда я использую метод takePicture() объекта Camera внутри кнопки мыши его захвата изображения.

Как сделать снимок без просмотра нажмите?

ответ

0

Вы не вызываете метод startPreview объекта Camera. Я думаю, вы должны позвонить startPreview, прежде чем сфотографироваться. В этом случае вы не установили экран предварительного просмотра:

try { 
    camera.setPreviewDisplay(surface.getHolder()); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Проверьте этот ответ: How to take pictures from the camera without preview when my app starts?

+0

В surfaceChanged метод я сделал это. –

+0

Я думаю, что метод surfaceCreated никогда не вызывался, потому что вы не задавали отображение предварительного просмотра. – bvarga

+0

Можем ли мы сделать снимок, не касаясь каких-либо видов? –

Смежные вопросы