首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义相机定位问题

自定义相机定位问题
EN

Stack Overflow用户
提问于 2014-12-23 10:47:25
回答 1查看 760关注 0票数 0

我已经建立了一个自定义相机应用程序。面对屏幕方向的问题,我不希望当方向发生变化时,活动被重新创建。请帮我解决这个问题。

在预览类中的surfaceChanged方法中获取空指针异常。

代码语言:javascript
复制
  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);

在下面的行中获取空指针异常:

代码语言:javascript
复制
        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:尝试在com.clarity.camera.CameraPreview.surfaceChanged(CameraPreview.java:230) at android.view.SurfaceView.updateWindow(SurfaceView.java:583) at android.view.SurfaceView.access$000(SurfaceView.java:86) at android.view.SurfaceView.access$000(SurfaceView.java:86)上调用空对象引用上的虚拟方法'java.lang.Object java.lang.NullPointerException.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)在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)在android.app.ActivityThread.main(ActivityThread.java:5086) at android.os.Looper.loop(Looper.java:136) at java.lang.reflect.Method.invoke(原生方法) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-23 10:51:50

如果你不想你的Activity被破坏,你可以把它放在你的活动标签中,你的manifest file

代码语言:javascript
复制
android:configChanges="orientation|screenSize|keyboardHidden"

这将告诉Android,您将自己处理orientationChanges。如果您是在Android 13或更高版本上开发,screenSize是很重要的。如果您正在为Android 12或更低版本开发,您可以不使用screenSize

这意味着onDestroy将不再被调用。相反,将调用onConfigurationChanged,当设备发生旋转时,您可以在此方法中处理任何您想要做的事情。

见此处:http://developer.android.com/guide/topics/resources/runtime-changes.html

为了帮助您完成NullPointerException,您需要发布LogCat输出,并告诉我们哪一行会抛出NPE!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27618799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档