Android 相机预览回调在 4.1 中未调用

2023-11-27

我有一个应用程序可以获取带有表面的相机预览帧。它可以在 Android 4.0.4 上运行,但更新后在同一设备上无法与 Jelly Bean 4.1.2 一起运行。简单来说,回调永远不会被回调。这是代码:剪了一点:

public class Panel extends Activity {
    Camera myCamera;
    int cameraId = -1;
    MyCameraSurfaceView myCameraSurfaceView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_panel);

        myCamera = getCameraInstance();
        myCamera.setPreviewCallback(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                Log.d("Camera Preview", data.length + "");
            }
        });

        myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
        FrameLayout myCameraPreview = (FrameLayout) findViewById(R.id.videoview);
        myCameraPreview.addView(myCameraSurfaceView);
    }

    private Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return c;
    }


    public class MyCameraSurfaceView extends SurfaceView implements
            SurfaceHolder.Callback {

        private SurfaceHolder mHolder;
        private Camera mCamera;

        public MyCameraSurfaceView(Context context, Camera camera) {
            super(context);
            mCamera = camera;
            mHolder = getHolder();
            mHolder.addCallback(this);
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            } catch (IOException e) {
            }
        }
    }
}

视频帧正在活动中显示,所以我无法弄清楚我做错了什么。


我已经使用另一个教程重写了代码。它有效,但现在速度较慢。我不知道确切的原因(可能是由于我使用的 N7000 ROM 泄露,它可能有错误,或者在 4.1 中实现方式不同,不确定)

相机预览.java

public class CameraPreview implements SurfaceHolder.Callback,
        Camera.PreviewCallback {
    int PreviewSizeWidth;
    int PreviewSizeHeight;
    SurfaceHolder mSurfHolder;
    Camera mCamera;

    public CameraPreview(int PreviewlayoutWidth, int PreviewlayoutHeight) {
        PreviewSizeWidth = PreviewlayoutWidth;
        PreviewSizeHeight = PreviewlayoutHeight;
    }



    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        Parameters p = camera.getParameters();  
        int width = p.getPreviewSize().width;
        int height = p.getPreviewSize().height;

        ByteArrayOutputStream outstr = new ByteArrayOutputStream();
        Rect rect = new Rect(0, 0, width, height);
        YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width,
                height, null);
        yuvimage.compressToJpeg(rect, 80, outstr); // outstr contains image in jpeg  
        String encodedImage = Base64.encodeToString(
                outstr.toByteArray(), Base64.DEFAULT); // this is base64 encoding of image


    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        Parameters parameters;
        mSurfHolder = arg0;

        parameters = mCamera.getParameters();
        parameters.setPreviewSize(PreviewSizeWidth, PreviewSizeHeight);

        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }

    public void surfaceCreated(SurfaceHolder arg0) {
        mCamera = Camera.open();
        try {
            // If did not set the SurfaceHolder, the preview area will be black.
            mCamera.setPreviewDisplay(arg0);
            mCamera.setPreviewCallback(this);
            Parameters p = mCamera.getParameters();
            p.setPreviewSize(PreviewSizeWidth, PreviewSizeHeight);
            mCamera.setParameters(p);
        } catch (IOException e) {
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        mCamera.setPreviewCallback(null);
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }
}

面板活动.java

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_panel);


    SurfaceView camView = new SurfaceView(this);
    SurfaceHolder camHolder = camView.getHolder();
    int width = 352; // must set a compatible value, otherwise it gets the default width and height
    int height = 288;

    camPreview = new CameraPreview(width, height);

    camHolder.addCallback(camPreview);
    camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    mainLayout = (FrameLayout) findViewById(R.id.videoview);
    mainLayout.addView(camView, new LayoutParams(width, height));

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

Android 相机预览回调在 4.1 中未调用 的相关文章

随机推荐

  • 如何在 Swift 中存根 URLSession?

    我一直在关注这个tutorial存根URLSession 这个例子是通过创建一个协议并扩展现有协议来完成的URLSession protocol URLSessionProtocol typealias DataTaskResult Dat
  • 在 Ruby 中使用 Iconv 进行音译

    当我尝试音译西里尔字母 utf 8 字符串时 Iconv iconv ascii ignore translit utf 8 string to s see 问题 1726404 音译 in ruby 除了那些必须音译的符号之外 我得到了所
  • 使用主题和代理传递数据

    是否可以在服务中使用主题实现 2 路数据流 例如 假设我希望某个组件检索信息 然后通过服务主题将其发布以供其他组件使用 然后 使用组件对此信息进行一些更改 然后重新发布它 以便原始组件可以检索更改 使用观察者模式可以实现这一点吗 另外 如果
  • Spring Boot 嵌入式 Tomcat 依赖在启动时引发异常

    我正在从 JBoss Wildfly 移植一个旧应用程序以在 tomcat 上运行 我能够完成的大部分事情都是通过网络上找到的资源完成的 然而 我对最新一期的运气不太好 我很早就知道我必须添加 providedRuntime org apa
  • 尝试在 Mac OS X 上使用 Subversion 提交时出现错误

    Using 颠覆我尝试承诺 svn ci dir filename 我明白了 svn system emacs svn commit tmp returned 256 这是什么意思 我该如何修复它 可能相关 我在上看到类似的错误vim设置时
  • 身份规范设置为 false

    我在用EF5 and Code First创建数据库 当实体有Id field EF 创建这样的字段Primary Key在数据库中并设置Identity specification to true 自动生成的值 如何设置Identity
  • 如何分析 C 程序的内存使用情况

    我需要弄清楚我正在运行的 Linux 程序的哪一部分占用了多少 百分比或绝对 内存 我需要创建多个此类程序的配置文件 以便我可以识别代码中一些较大的内存消耗者 并查看是否可以优化它们以减少使用 我需要在 MIPS 平台上使用它 不幸的是 V
  • 结合Raphael和jQuery实现浏览器兼容

    发现IE不处理javascriptonmouseout 我决定改用 jQuery 这样跨浏览器兼容性就会自动得到解决 我正在制作一个由 svg 路径定义的区域 当鼠标悬停在其上方时 该区域会亮起 并且我改编了 Raphael 网站上提供的代
  • 使用适配器动态更新列表视图

    This教程使用 SimpleAdapter 工作正常 但我需要在输入新数据时更新适配器中的数组 您能否指导我如何使用 SimpleAdapter 以外的其他内容更新 ListView Use a 阵列适配器由 ArrayList 支持 要
  • 如何定义 matplotlib 和 seaborn 轴

    我在绘图中打开和关闭轴以及适当调整轴的大小时遇到 困难 我已经关注了几个线程 我的方法是 f1 plt figure 1 3 3 ax Subplot f1 111 f1 add subplot ax ax scatter current
  • Objective-C,对包含数字的字符串数组进行排序[重复]

    这个问题在这里已经有答案了 假设我有一个像这样的数组 NSArray arr 1 4 2 8 11 10 14 9 note strings containing numbers 我想像这样对它们进行排序 1 2 4 8 9 10 11 1
  • 想要用 sympy 进行多变量最小化

    我想使用符号字符对 scipy optimize 进行最小化 from scipy optimize import minimize from sympy utilities lambdify import lambdify import
  • *、$ 和 # 之间的区别

    我是 thymeleaf 的新手 经常看到这三个操作员 有什么区别 and 我知道它们用于从 MVC 访问数据 但在什么情况下呢 The 表达式类型Thymeleaf 支持是 变量表达式 这些是标准的表达方式 选择变量表达式 它们与变量表达
  • Qt 多媒体:找不到-lpulse

    我修改了 pro QT core gui multimedia multimediawidgets 我包括
  • 为什么在重新分区 Spark Dataframe 时会出现这么多空分区?

    我想将数据框 df1 分区为 3 列 该数据框恰好有这 3 列的 990 个独特组合 In 17 df1 createOrReplaceTempView df1 view In 18 spark sql select count from
  • 使用 AVFoundation 进行视频录制

    我正在尝试使用 AVFoundation 录制视频 当我仅向会话添加视频输入时 一切正常 但是当我向其中添加音频输入时 它会停止录制视频 录制开始后立即调用委托方法 这是我的代码 void recordVideo self session
  • 我的计算机中缺少 SDL.dll - VS 2010

    我正在尝试编译我编写的 SDL 程序 但是当我这样做时 会出现以下错误 该程序无法启动 因为您的计算机缺少 SDL dll 尝试重新安装程序来解决此问题 我不知道为什么 我有SDL dll 我已将其放入正确的文件夹中 C Windows S
  • 如何更新 bootstrap-typeahead.js 中的源选项

    我使用 bootstrap typeahead 来允许多重选择 这里是demo 原始代码已由 Sherbrow 更新Twitter bootstrap 预先输入多个值 我的问题与以下用例相关 插入后Alaska值 我想更新不再显示的源Ala
  • 什么时候可以使用前向声明?

    我正在寻找何时允许在另一个类的头文件中对一个类进行前向声明的定义 我是否可以对基类 作为成员持有的类 通过引用传递给成员函数的类等执行此操作 将自己置于编译器的位置 当你向前声明一个类型时 编译器只知道该类型存在 它对其规模 成员或方法一无
  • Android 相机预览回调在 4.1 中未调用

    我有一个应用程序可以获取带有表面的相机预览帧 它可以在 Android 4 0 4 上运行 但更新后在同一设备上无法与 Jelly Bean 4 1 2 一起运行 简单来说 回调永远不会被回调 这是代码 剪了一点 public class