2014-12-23 87 views
0

我已經構建了一個自定義攝像機應用程序。面向屏幕方向的問題,我不希望活動在方向更改時重新創建。請使用完整的解決方案幫助我解決這個問題。自定義攝像機方向問題

獲取預覽類中的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); 

獲取在下面的行空指針異常:

 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 E/AndroidRuntime:致命異常:主 工藝:com.clarity.camera,PID:8845 顯示java.lang.NullPointerException:嘗試在android上的com.clarity.camera.CameraPreview.surfaceChanged(CameraPreview.java:230) 上的空對象引用 上調用虛擬方法'java.lang.Object android.content.Context.getSystemService(java.lang.String)' .view.SurfaceView.updateWindow(SurfaceView.java:583) 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) 在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1897) 在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1019) 在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5725) (Choreographer.java:544) at android.view.Choiceographer $ CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:544) (Handler.java:95) 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.invoke(Native Method) at 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。如果您正在開發Android API 13或更高版本,則screenSize非常重要。如果您正在開發Android API 12或更低版本,則可以將screenSize退出!

這意味着onDestroy將不會再被調用。而是調用onConfigurationChanged,您可以在發生設備旋轉時處理此方法中的任何想要執行的操作。

在這裏看到:http://developer.android.com/guide/topics/resources/runtime-changes.html

,以幫助您的NullPointerException異常,你需要來發表您的logcat輸出,並告訴我們這行正是拋出NPE!

+0

E/AndroidRuntime:致命異常:主 工藝:PID:8845 顯示java.lang.NullPointerException:嘗試調用虛擬方法「java.lang.Object中android.content.Context.getSystemService(java.lang中.String)'在CameraPreview.surfaceChanged上的空對象引用 –

+0

@LithitTs將您的整個logcat放入您的問題底部! – Mike

+0

我可以在自定義相機應用程序中調用onConfigurationChanged嗎?如果可能的話,我應該在這種方法中處理什麼。 –