2014-12-23 1 views
0

Я создал пользовательское приложение для камеры. Перед лицом проблемы в ориентации экрана, и я не хочу, чтобы деятельность была воссоздана при изменении ориентации. Пожалуйста, помогите мне в этом с полным решением.Пользовательская ориентация камеры

Получение исключения NULL-указателя внутри метода surfaceChanged в классе предварительного просмотра.

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

     if (mCamera != null) { 
      Camera.Parameters parameters = mCamera.getParameters(); 
      Log.d("SurfaceChanged", "getting parameters" + parameters); 

Получение исключение указателя NULL в строке ниже:

 Display display =        ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     Log.d("SurfaceChanged", "Getting the system services"); 
     if(display.getRotation() == Surface.ROTATION_0){ 
      Log.d("SurfaceChanged", "Inside the if condition 1"); 
      parameters.setPreviewSize(height,width); 
      Log.d("SurfaceChanged", "setting preview size"); 
      mCamera.setDisplayOrientation(90); 
      Log.d("SurfaceChanged", "setting display orientation as 90"); 
     } 

     if(display.getRotation() == Surface.ROTATION_90){ 
      Log.d("SurfaceChanged", "Inside the if condition 2"); 
      parameters.setPreviewSize(width,height); 
      Log.d("SurfaceChanged", "setting the preview size 2 "); 
     } 

     if(display.getRotation() == Surface.ROTATION_180){ 
      Log.d("SurfaceChanged", "Inside the if condition 3"); 
      parameters.setPreviewSize(height,width); 
      Log.d("SurfaceChanged", "setting the preview size 3"); 
     } 

     if(display.getRotation() == Surface.ROTATION_270){ 
      Log.d("SurfaceChanged", "Inside the if condition 4"); 
      parameters.setPreviewSize(width,height); 
      Log.d("SurfaceChanged", "setting preview size 4"); 
      mCamera.setDisplayOrientation(180); 
      Log.d("SurfaceChanged", "setting display orientation as 180"); 
     } 

     mCamera.setParameters(parameters); 
     Log.d("SurfaceChanged", "setting the parameters"); 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      Log.d("SurfaceChanged", "setting preview display to mHolder"); 
      mCamera.startPreview(); 
      Log.d("SurfaceChanged", "preview as started"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

Любая помощь будет принята с благодарностью.

12-23 16: 07: 34,962 8845-8845/com.clarity.camera Е/AndroidRuntime: неустранимый: Основной процесс: com.clarity.camera, ПИД: 8845 java.lang.NullPointerException: Попытка invoke virtual method 'java.lang.Object android.content.Context.getSystemService (java.lang.String)' на нулевой ссылке объекта на com.clarity.camera.CameraPreview.surfaceChanged (CameraPreview.java:230) на android .view.SurfaceView.updateWindow (SurfaceView.java:583) на android.view.SurfaceView.access $ 000 (SurfaceView.java:86) на android.view.SurfaceView $ 3.onPreDraw (SurfaceView.java:175) на android .view.ViewTreeObserver.dispatchOnPreDraw (ViewTreeObserver.java:847) в android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1897) в android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1019) в android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:5725) на android.view.Choreographer $ CallbackRecord.run (Хореограф.java:761) на android.view.Choreographer.doCallbacks (Хореограф.java:574) на android.view.Choreographer.doFrame (Хореограф.java:544) на android.view.Choreographer $ FrameDisplayEventReceiver.run (Хореограф.java:747) на android.os.Handler.handleCallback (Handler.java:733) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:136) на android.app.ActivityThread.main (ActivityThread.java:5086) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java : 785) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:601)

+0

Опубликуйте LogCat –

ответ

0

Если вы не хотите, чтобы ваши Activity быть разрушенным вы можете поместить это в тегах активности в вас manifest file:

android:configChanges="orientation|screenSize|keyboardHidden" 

Это скажет Android, что вы собираетесь обрабатывать orientationChanges самостоятельно. screenSize важен, если вы разрабатываете Android 13 или выше. Если вы разрабатываете Android API 12 или ниже, вы можете оставить screenSize!

Это значит, что onDestroy больше не будет вызываться. Вместо этого вызывается onConfigurationChanged, и вы можете обрабатывать то, что вы хотите сделать в этом методе, когда происходит поворот устройства.

Смотрите здесь: http://developer.android.com/guide/topics/resources/runtime-changes.html

, чтобы помочь вам с NullPointerException вы должны будете опубликовать LogCat выход и сказать нам, какие именно линии бросает NPE!

+0

E/AndroidRuntime: FATAL ИСКЛЮЧЕНИЕ: главный процесса: PID: 8845 java.lang.NullPointerException: Попытка вызвать виртуальный метод «java.lang.Object android.content.Context.getSystemService (java.lang .String) 'на нулевой ссылке на объект на CameraPreview.surfaceChanged –

+0

@LikithTs Отправьте весь свой лог-код в свой вопрос внизу! – Mike

+0

Могу ли я вызвать onConfigurationChanged в пользовательском приложении камеры. Если возможно, что я должен обрабатывать внутри этого метода. –