【问题标题】:CWAC camera library out of memoryCWAC 相机库内存不足
【发布时间】:2014-06-30 13:37:09
【问题描述】:

我在尝试使用 android 中的 CWAC 库拍照时内存不足。我只是在主要活动中使用一个按钮并动态创建片段。

预览会很好。但是当我点击拍照时,它会因内存不足而崩溃。有人可以建议如何解决这个问题吗?

CameraFragment cameraFragment = new CameraFragment();

        setContentView(R.layout.activity_shopping);
        //Create the CameraFragment and add it to the layout
        //CameraFragment f = new CameraFragment();
        getFragmentManager().beginTransaction()
                .add(R.id.container, cameraFragment, TAG_CAMERA_FRAGMENT)
                .commit();

        //Set the CameraHost
        SimpleCameraHost.Builder builder=
                new SimpleCameraHost.Builder(new SimpleCameraHost(this));

        //SimpleCameraHost simpleCameraHost = new SimpleCameraHost(this);
        cameraFragment.setHost(builder.useFullBleedPreview(true).build());

        takePicture = (Button) findViewById(R.id.buttonPicture);

        //Set an onClickListener for a shutter button
        findViewById(R.id.buttonPicture).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePicture();
            }
        });

private void takePicture() {
    CameraFragment f = (CameraFragment) getFragmentManager().findFragmentByTag(TAG_CAMERA_FRAGMENT);
    if (f != null && f.isVisible()) {
        PictureTransaction xact=new PictureTransaction(f.getHost());

    xact.flashMode(Camera.Parameters.FLASH_MODE_AUTO);
    f.takePicture(xact);
    }
}

06-30 15:32:10.661  29474-29823/com.aithops.provrum.app E/dalvikvm-heap﹕ Out of memory on a 31961104-byte allocation.
06-30 15:32:10.661  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ "Thread-32873" prio=5 tid=12 RUNNABLE
06-30 15:32:10.661  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ | group="main" sCount=0 dsCount=0 obj=0x425fcb40 self=0x5976d688
06-30 15:32:10.661  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ | sysTid=29823 nice=0 sched=0/0 cgrp=apps handle=1501887568
06-30 15:32:10.661  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ | state=R schedstat=( 424041835 31308999 114 ) utm=36 stm=5 core=3
06-30 15:32:10.661  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ at android.graphics.Bitmap.nativeCreate(Native Method)
06-30 15:32:10.666  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:726)
06-30 15:32:10.666  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:703)
06-30 15:32:10.666  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ at android.graphics.Bitmap.createBitmap(Bitmap.java:636)
06-30 15:32:10.666  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ at com.commonsware.cwac.camera.ImageCleanupTask.run(ImageCleanupTask.java:121)
06-30 15:32:10.666  29474-29823/com.aithops.provrum.app I/dalvikvm﹕ [ 06-30 15:32:10.666 29474:29823 W/dalvikvm ]
    threadid=12: thread exiting with uncaught exception (group=0x41a33700)
06-30 15:32:10.671  29474-29823/com.aithops.provrum.app E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-32873
    java.lang.OutOfMemoryError
            at android.graphics.Bitmap.nativeCreate(Native Method)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:726)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:703)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:636)
            at com.commonsware.cwac.camera.ImageCleanupTask.run(ImageCleanupTask.java:121)

【问题讨论】:

    标签: android commonsware-cwac


    【解决方案1】:

    the documentation 对此进行了介绍。要么使用android:largeHeap="true",要么让你的CameraHostmaxPictureCleanupHeapUsage()返回更接近0.0f的东西。

    【讨论】:

    • 伟大的大堆工作。如何计算 maxPictureCleanupHeapUsage() 的合理值?
    • @user2130951:“我如何计算 maxPictureCleanupHeapUsage() 的合理值?” ——嗯……向飞镖板扔飞镖? :-) 说真的,我真的不知道。从长远来看,我希望将所有图像处理都移到 NDK 中,因此我首先离开了 Dalvik/ART 堆。 maxPictureCleanupHeapUsage() 是那些想要避免使用android:largeHeap="true" 的黑客,但它背后并没有太多的科学分析。不利的一面是,这意味着某些设备可能无法清理图像,从而导致输出不一致。
    • 我只是想补充一点——通过在maxPictureCleanupHeapUsage() 中使用 1.0f,它会为您提供正确定向的图像但是它需要 5-10 秒才能返回,取决于捕获大小。另一方面,使用 0.0f 将立即返回,但图像可能会旋转。因此,取决于您是否要自己处理旋转,例如先调整大小而不是旋转(因此要处理的像素更少),或者先在前景进行缩略图旋转,然后在后台进行全尺寸旋转,以免用户等待。
    • @CommonsWare 版本 2 的文档似乎没有任何与 OOM(或内存)相关的内容。我在第 2 版中遇到了 OOM,虽然 largeHeap 解决方案有效,但您是否想出了其他方法来处理这个问题?
    • @Shurikn:我不知道“版本 2”是什么。如果您的意思是CWAC-Cam2,请隔离摄像头工作in its own process。如果您仍然遇到 OOM,请给我a reproducible scenario,我可以调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多