当前位置: 首页 > 知识库问答 >
问题:

自定义摄像机定向问题

仉联
2023-03-14

我已经建立了一个自定义的相机应用程序。面对屏幕方向的问题,我不希望在方向改变时重新创建活动。请用完整的解决方案帮助我。

在预览类中的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。清晰摄像机E/AndroidRuntime﹕ 致命异常:主进程:com。清晰摄像头,PID:8845 java。lang.NullPointerException:尝试调用虚拟方法“java”。lang.对象android。所容纳之物上下文getSystemService(java.lang.String)“”位于com上的空对象引用上。清晰照相机摄影评论。android上的surfaceChanged(CameraPreview.java:230)。看法SurfaceView。在android上更新Windows(SurfaceView.java:583)。看法SurfaceView。在android上访问$000(SurfaceView.java:86)。看法SurfaceView 3美元。android上的onPreDraw(SurfaceView.java:175)。看法ViewTreeObserver。android上的dispatchOnPreDraw(ViewTreeObserver.java:847)。看法ViewRootImpl。android上的performTraversals(ViewRootImpl.java:1897)。看法ViewRootImpl。android上的doTraversal(ViewRootImpl.java:1019)。看法ViewRootImpl$TraversalRunnable。在android上运行(ViewRootImpl.java:5725)。看法编舞$CallbackRecord。在android上运行(Choreographer.java:761)。看法编舞android上的doCallbacks(Choreographer.java:574)。看法编舞android上的doFrame(Choreographer.java:544)。看法Choreographer$FrameDisplayEventReceiver。在android上运行(Choreographer.java:747)。操作系统。处理程序。android上的handleCallback(Handler.java:733)。操作系统。处理程序。android上的dispatchMessage(Handler.java:95)。操作系统。活套。android上的loop(Looper.java:136)。应用程序。活动线程。java上的main(ActivityThread.java:5086)。朗。反思。方法在com上调用(本机方法)。Android内部的操作系统。ZygoteInit$MethodandArgscaler。在com上运行(ZygoteInit.java:785)。Android内部的操作系统。合子体。main(ZygoteInit.java:601)

共有1个答案

汪深
2023-03-14

如果您不想销毁您的活动,您可以将其放入清单文件中的活动标签中:

android:configChanges="orientation|screenSize|keyboardHidden"

这将告诉Android,您将自己处理方向更改<如果您是在Android API 13或更高版本上开发,代码>屏幕大小非常重要。如果您正在为Android API 12或更低版本开发,您可以将screenSize排除在外!

这意味着将不再调用onDestroy。取而代之的是调用onConfigurationChanged,当设备发生旋转时,您可以在这个方法中处理您想要做的事情。

看这里:http://developer.android.com/guide/topics/resources/runtime-changes.html

为了帮助您处理NullPointerException,您需要发布您的LogCat输出,并告诉我们哪一行正确抛出NPE!

 类似资料:
  • 我创建了自定义相机活动,但拍摄的图像方向错误。当我在纵向模式下拍摄图像并将其旋转90度后。它处于原始位置,但在横向模式下以错误方向拍摄图像。 相机方向在纵向模式下捕获图像时 用于解决相机预览问题。 检查位图方向。

  • 我的应用程序使用intent拍照。如果我按肖像方向拍摄,我会得到图像。但当我旋转我的设备,并采取横向方向,我得到了错误。甚至错误消息指向(可能)错误的行。 打开相机: 关于活动结果: 给出解释的结果。然后我用其他代码再试一次<打开摄像机: 关于活动结果: 仍然有相同的结果<在寻找一些解决方案后,他们谈到了保存实例。然后我把这个(我使用片段) 仍未工作,其中一条错误消息指向 在onCreate(Bu

  • 我试图学习如何创建自定义录像机,一切工作良好,除了音频有很多嘈杂的声音。我在系统相机、instagram或任何其他相机应用程序中尝试,它们的音频质量非常好,没有某种低音。此外,视频的录制量也明显低于其他相机应用。我在stackoverflow上找不到任何答案,其中大多数有关于的答案,但在上没有。 如何提高录制视频时的音频质量? 如何增加视频的录制量? 我知道如何增加它时,只是纯录制音频与下面的代码

  • 有人知道模拟器相机启动时是否有可能打开一些个人照片吗? 我有一个基于图像分析的应用程序,我想当我点击相机的按钮时,相机打开的不是默认的Android emulator运动图像。我希望它打开一些我设置为默认图像的图像。因此,当我选择拍照时,它将只显示该图像,当我拍照时,该图像将保存到gallery,而不是Android默认图像。

  • 所以我用下面的方法设置了摄像头- 如您所见,我在摄像机参数上使用了setRoation()来实际指定图像方向,并在摄像机本身上使用了setDisplayOriation()来处理表面预览中的方向更改。(注释和未注释的代码似乎都没有保留方向。当我检查数据时,它返回0) 之后,在回调中,我甚至尝试使用矩阵保存具有方向的图像。 实际问题 > 当我在肖像模式下拍照时,一切正常。它看起来像是被拿走了。 但是

  • 我的ISP不允许我的cpanel托管的laravel站点具有自定义根文件夹(laravel结构中的公用文件夹)。 这意味着我不能让服务器将/public\u html/public作为根目录。它必须始终是/public\u html 根据他们的指导,我设置了以下/public\u html/。htaccess规则,使Laravel公用文件夹显示为根文件夹 这或多或少有效,但并不完全有效。问题是,如