surfaceView.getHolder 不返回 SurfaceHolder

2023-11-24

我正在尝试编写一个使用相机的应用程序。当尝试获取最终传递给启动相机的 surfaceCreated() 的 surfaceHolder 时,我收到 NullPointerException 。 getHolder()是否有返回NULL的情况?

thanks.

package com.tecmark;

import java.io.IOException;

import android.app.Activity;

import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;

public class cameraView extends Activity implements SurfaceHolder.Callback{

    SurfaceView mSurfaceView;
    SurfaceHolder mSurfaceHolder;
    Camera mCamera;
    boolean mPreviewRunning;

 /** Called when the activity is first created. */
    @Override 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        getWindow().setFormat(PixelFormat.TRANSLUCENT);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //setContentView(R.layout.camera_surface);   

        mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera);
        Log.i("surfaceholder = ", "about to get surface holder");
        try{
        mSurfaceHolder = mSurfaceView.getHolder();
        }catch(Exception e){
         e.printStackTrace();
        }

        Log.i("surfaceholder = ", ""+mSurfaceHolder.toString());

        mSurfaceHolder.addCallback(this);

        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        setContentView(R.layout.camera_surface);

        surfaceCreated(mSurfaceHolder);







    }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

  if (mPreviewRunning) {

   mCamera.stopPreview();

   }

   Camera.Parameters p = mCamera.getParameters();

   p.setPreviewSize(w, h);

   mCamera.setParameters(p);

   try {

   mCamera.setPreviewDisplay(holder);

   } catch (Exception e) {

   e.printStackTrace();

   }

   mCamera.startPreview();

   mPreviewRunning = true;

   }






 @Override
 public void surfaceCreated(SurfaceHolder holder) {




  try{
   Log.i("camera ", "about to open camera");
         mCamera = Camera.open();
         Log.i("camera ", " camera opened");
         mCamera.getParameters();
         mCamera.setPreviewDisplay(holder);
         mCamera.startPreview();
   } catch (IOException e) {

    e.printStackTrace();
   }
  Log.i("camera ", "ok");
 }

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

  mPreviewRunning = false;

  mCamera.release();

 }




}//end of activity



01-31 15:29:17.773: WARN/System.err(9144): java.lang.NullPointerException
01-31 15:29:17.778: WARN/System.err(9144):     at com.tecmark.cameraView.onCreate(cameraView.java:42)
01-31 15:29:17.778: WARN/System.err(9144):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-31 15:29:17.778: WARN/System.err(9144):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
01-31 15:29:17.783: WARN/System.err(9144):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
01-31 15:29:17.783: WARN/System.err(9144):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
01-31 15:29:17.783: WARN/System.err(9144):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
01-31 15:29:17.783: WARN/System.err(9144):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-31 15:29:17.783: WARN/System.err(9144):     at android.os.Looper.loop(Looper.java:123)
01-31 15:29:17.783: WARN/System.err(9144):     at android.app.ActivityThread.main(ActivityThread.java:4363)
01-31 15:29:17.783: WARN/System.err(9144):     at java.lang.reflect.Method.invokeNative(Native Method)
01-31 15:29:17.788: WARN/System.err(9144):     at java.lang.reflect.Method.invoke(Method.java:521)
01-31 15:29:17.788: WARN/System.err(9144):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-31 15:29:17.788: WARN/System.err(9144):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-31 15:29:17.788: WARN/System.err(9144):     at dalvik.system.NativeStart.main(Native Method)
01-31 15:29:17.793: DEBUG/AndroidRuntime(9144): Shutting down VM
01-31 15:29:17.793: WARN/dalvikvm(9144): threadid=3: thread exiting with uncaught exception (group=0x4001b180)
01-31 15:29:17.793: ERROR/AndroidRuntime(9144): Uncaught handler: thread main exiting due to uncaught exception
01-31 15:29:17.803: ERROR/AndroidRuntime(9144): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tecmark/com.tecmark.cameraView}: java.lang.NullPointerException
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.os.Looper.loop(Looper.java:123)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.app.ActivityThread.main(ActivityThread.java:4363)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at java.lang.reflect.Method.invokeNative(Native Method)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at java.lang.reflect.Method.invoke(Method.java:521)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at dalvik.system.NativeStart.main(Native Method)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144): Caused by: java.lang.NullPointerException
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at com.tecmark.cameraView.onCreate(cameraView.java:47)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):     ... 11 more

开始一个新的答案希望更清楚。再说一次,我认为根本问题是你在 onCreate 和 onResume 中所做的事情的数量。

我认为您遇到的根本问题是视图/活动生命周期的某些部分需要在您开始处理 SurfaceView 并开始使用它之前运行它们的过程。

我不确定这一点,但这里是我在一个有效的增强现实应用程序中处理各种相机和表面视图内容的各个地方的细分:

onCreate()
{
    // just set content view. do nothing with the camera or surfaceView yet
    setContentView(R.layout.main);
}

onResume()
{
        // open camera
    mCamera = Camera.open();

    // init surface view
    sv = (SurfaceView)this.findViewById(R.id.SurfaceView01);
            mHolder = sv.getHolder(); 
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
            mHolder.setSizeFromLayout();
            mHolder.addCallback(this); 
}

surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
    mCamera.setPreviewDisplay(holder);
    // set any cam params you need...

    mCamera.startPreview();
}

尝试重构您的代码以执行类似的操作。我的眼睛变得模糊,试图从你的来源中找出 NPE 发生的位置,但我认为有几个问题:

  • 您似乎试图在调用 setContentView() 之前获取对 SurfaceView 的引用
  • 您直接调用 surfaceCreated 方法,而不是通过回调调用它。

希望有帮助。我们会弄清楚这个问题的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

surfaceView.getHolder 不返回 SurfaceHolder 的相关文章

  • 什么是适合 Android 的 html 解析器?

    什么是适合 Android 的 html 解析器 这取决于你想做什么 如果你真的想处理 html Java 中有很多 html 解析器可以使用 这里有一些 https stackoverflow com questions 2168610
  • 在 Android 上生成 FileDescriptor 而不先打开文件

    在Android中 是否可以直接从字节数组生成FileDescriptor 而不必先打开文件 在 Android 2 2 中 我动态生成 MIDI 文件 然后使用 MediaPlayer 进行播放 我在下面包含了成功执行此操作的 Main
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 由于现有相机用户,相机“0”的手电筒不可用

    我想创建一个应用程序 它有一个用于录制视频的按钮和另一个单独的切换按钮 用于在录制视频期间打开闪光灯 我已经使用camera2 API为最近的androids构建了相机应用程序 可以通过图像按钮访问 我将火炬模式设置为切换按钮 但这根本不起
  • 禁用 com.google.android.maps.MapView 中的平移/缩放

    如何禁用 MapView 的平移 缩放功能 不是缩放控件 我想要一个完全静态的地图 我还注意到触摸地图似乎不会触发 MapView onClickListener 有人可以详细说明为什么吗 对于 Android 版 Google Maps
  • 简单 XML 框架:ElementMap 中的对象具有“类似内联”的行为

    我正在尝试在 Android 上序列化自定义对象的 Hashmap 以获得如下 xml
  • Android任务执行中的“platformAttrExtractor”是什么?

    我介绍了我的构建关注者操作说明 https developer android com studio build optimize your build html profile在安卓中 gradlew profile recompile
  • 在android Gridview中合并行和列

    我正在android中做一个图像查看页面 我需要在某些地方合并行 在某些地方合并列 我们可以在gridview中做到这一点吗 如果我们选择任何合并图像 则应选择整个图像视图 请任何人告诉我一个建议 提前致谢 Try 非对称网格视图 http
  • Android 软键盘 - 禁用某些键

    我正在寻找一种使用内置软键盘并禁用某些键的方法 例如 如果用户不应该使用字母 f 因为在列表中该字母不存在 则该键应显示为灰色 想象一下 用户可以在文本框中键入文本以从列表中进行选择 该列表包含 ABC BCCD 床 如果用户输入 A 然后
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • 返回到上一个活动的最后状态

    我有两个活动 A 和 B 当应用程序启动时 活动 A 会被加载 我会从数据库将数据加载到其中 我可以毫无问题地转到活动 B 但是当我返回活动 A 时 会查看旧数据一段时间 然后重新加载活动 知道如何解决这个问题吗 在从数据库加载数据之前清除
  • “添加到 FragmentContainerView 的视图必须与 Fragment 关联”与 android 导航组件

    当导航组件切换到片段时 我收到 添加到 FragmentContainerView 的视图必须与片段关联 崩溃 这是什么原因造成的 我没有在任何地方看到提到这一点 并且花了一段时间才弄清楚 但在这种情况下 我试图在迁移到导航拱门组件时设置一
  • 如何告诉 OkHttpClient 忽略缓存并强制从服务器刷新?

    在我的 Android 应用程序中 我将 Retrofit 与 OkHttpClient 结合使用 并启用缓存来访问某些 API 我们的一些 API 有时会返回空数据 我们在应用程序中提供了一个 刷新 按钮 供客户端从特定 API 重新加载
  • 当类明显存在时,我收到 java.lang.NoClassDefFoundError

    当我尝试在运行时使用该库时 出现以下错误 java lang NoClassDefFoundError com google api client extensions android2 AndroidHttp 我已经将此库添加到我的项目中
  • Google Wallet for Digital Goods API 与 Google Play 应用内结算

    想知道 Google 电子钱包结算 API 和 Google Play 应用内结算之间有什么区别 与 Google 电子钱包结算 API 相比 使用 GooglePlay 应用内购买结算服务有何优势 我看到 Wallet API 也支持 A
  • Android - 在图像/缩略图上覆盖播放按钮的最佳方式

    我有一个 Android 应用程序 可以播放音频 视频并显示图片 对于视频 我想在预览图像顶部以及列表视图中叠加一个播放按钮 现在我的做法是使用 xml 中的 ImageView 然后可绘制对象是一个图层图层列表 我以编程方式定义它 因为其
  • Android 应用程序不需要任何特殊访问权限

    当我开始安装时myapp apk 我得到下面的屏幕 我的应用程序需要位置 外部存储权限 上述权限应该根据需要向用户请求 即在需要这些权限的代码之前 现在 当安装应用程序时 我会看到一个屏幕 上面显示应用程序不需要任何特殊访问权限 如下图所示
  • 线性布局高度和重量

    我有以下内容
  • 解析 XML 标签不匹配时出错

  • 无法使用 Zxing Android 扫描 Code 128

    我已将 ZXing 条码阅读器集成到我的 Android 应用程序中 它可以扫描大部分代码 但我有一张电费单 它无法扫描 使用 Galaxy Ace 5 0MP 我认为问题是由于相机分辨率和焦点造成的 因为当我使用 Xperia SL 12

随机推荐

  • 使用 python 导入我的数据库连接

    是否可以使用我的数据库凭据创建一个 py 文件来连接到 MySQL 数据库 Ex con ip 0 0 0 0 username root password pswd database test 然后在另一个文件上使用这个文件 like i
  • condition_variable.notify_all 是否应该被互斥锁覆盖?

    我已经实现了一个类 它允许我将线程与条件变量同步 我发现关于 notify all 应该在锁内还是在锁外完成的冲突信息 我发现了两种方式构建的例子 首先释放锁的理由是为了防止等待线程在被通知释放后立即阻塞在互斥锁上 反对首先释放锁的论点是等
  • SQL Server 在多个列上进行透视

    我正在尝试在多个列上进行旋转 我正在使用 SQL Server 2008 这是我迄今为止尝试过的 CREATE TABLE t id int Rscd varchar 10 Accd varchar 10 position int INSE
  • 跨站点将 DisplayFormatAttribute.ConvertEmptyStringToNull 的默认值设置为 false

    属性 DisplayFormatAttribute ConvertEmptyStringToNull 的默认值为 true 我想将整个站点的默认值设置为 false 或者按类或页面也可以 有没有办法可以做到这一点 这样我就不需要用以下内容装
  • Python 中带有字符串的 3D 散点图

    我尝试在 Python 中绘制 3D 散点图 其中 x 和 y 上有字符串类别 即神经网络的激活函数和求解器 z 轴上有浮点数 即 NN 的准确度分数 以下示例引发错误 ValueError 无法将字符串转换为浮点数 str1 我按照此文档
  • VueJS v-bind:背景图像的样式:url()

    根据VueJS docs div div 我尝试过几种模式 div div div div div div 但结果对于 HTML 无效style属性 有任何想法吗 尝试其他模式后 这是有效的模式
  • 使用 OCR 从图像文件读取文本的 API

    我正在寻找 Java 中 OCR 光学字符识别 的示例代码或 API 名称 使用它我可以从图像文件中提取所有文本 无需将其与我使用下面的代码所做的任何图像进行比较 public class OCRTest static String STR
  • 如何禁用 Django Celery 管理模块?

    我不需要 Django 管理中的 celery 模块 有什么办法可以将其删除吗 更具体地说 在admin py里面任何应用程序的INSTALLED APPS after djcelery from django contrib import
  • adb 在 Windows 上不被识别为内部或外部命令

    我设置了c android sdk tools路径环境和命令的路径 例如emulator工作得很好 但是adb命令仍然无法识别 我该怎么办 In the path系统变量我添加了android sdk路径和tools到目前为止的路径 还有什
  • 在 Node.js 中使用远程图像提供动态生成的 PDF

    我正在尝试创建一个节点服务器 使用以下命令即时生成 PDFPDFKit PDF 是根据 POST 请求的参数生成的 通过Express 其中一个参数指定图像 URL 服务器将下载该图像 URL 并将其注入到 PDF 中 现在 我有以下结构
  • 无法找到包 NETStandard.Library

    我尝试在 Visual studio 2019 中添加一个新的类库 Net Standard 但我得到这个错误信息 无法找到包 NETStandard Library 不存在任何软件包 此 id 来源 Microsoft Visual St
  • 将 JSON 字符串发布到 WEB API

    我有一个ASP NET WEB API 2需要有一个应用程序POST方法接受一个JOSN string结构未知javascript 我启用了cors and GET方法工作正常 但是发送时JSON从客户端 api 的方法参数始终是null
  • Mongoose Typescript 方式...?

    尝试在 Typescript 中实现 Mongoose 模型 搜索 Google 只发现了一种混合方法 结合 JS 和 TS 如果没有 JS 按照我相当幼稚的方法 如何实现 User 类呢 希望能够没有包袱的IUserModel impor
  • jQuery 打开按按钮选择

    如何通过按钮打开选择下拉菜单 button on click function select trigger click 我的代码 http jsfiddle net UGkWp UPDATE 我找到了针对 webkit 浏览器的解决方案
  • 传递到字典中的模型项的类型为“System.Data.Entity.DynamicProxies.Object”

    有谁知道为什么我会收到此错误 The model item passed into the dictionary is of type system Data Entity DynamicProxies Object 3E186F80358
  • java中的KeyPressed事件

    我刚刚创建了一个java tic tac toe 游戏 我想弄清楚在特定条件下按下回车键后如何运行一个方法 示例如下 if condition is met keyListener 根据您想要捕获 enter 键的位置 您可以使用Actio
  • 清除 Magento 缓存

    我正在使用 Magento 1 6 1 版 我需要以编程方式清除 Magento 缓存 Mage app gt getCache gt clean 我使用了上面的代码 但它没有清除缓存 try this Mage app gt cleanC
  • 如何正确更新我的图表值? (实时)

    我最近遇到了一个名为 LiveChart 的工具 并决定对其进行测试 不幸的是 我在弄清楚如何实时更新图表值时遇到了一些问题 我很确定有一种干净且正确的方法可以做到这一点 但我无法找到它 我希望能够通过更新值private void或按钮
  • ExtJs:在组合框中搜索/过滤

    我在 ExtJs 2 3 中遇到以下问题 我想在组合框中进行搜索 我给你举个例子 Ext comboData names Peter Paul Amanda var store new Ext data SimpleStore fields
  • surfaceView.getHolder 不返回 SurfaceHolder

    我正在尝试编写一个使用相机的应用程序 当尝试获取最终传递给启动相机的 surfaceCreated 的 surfaceHolder 时 我收到 NullPointerException getHolder 是否有返回NULL的情况 than