Библиотеке камеры CWAC не хватает памяти

Я получаю нехватку памяти, пытаясь сделать снимок с библиотекой CWAC в Android. Я просто использую кнопку в основном действии и создаю фрагмент на лету.

Превью подойдет. Но когда я нажимаю сделать снимок, он вылетает из-за нехватки памяти. Может кто подскажет как решить эту проблему?

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)

person user2130951    schedule 30.06.2014    source источник


Ответы (1)


Это описано в документации. Либо используйте android:largeHeap="true", либо пусть ваш CameraHost вернет что-то более близкое к 0.0f из maxPictureCleanupHeapUsage().

person CommonsWare    schedule 30.06.2014
comment
Отличная большая куча работает. Как мне рассчитать разумное значение для maxPictureCleanupHeapUsage()? - person user2130951; 30.06.2014
comment
@ user2130951: Как мне рассчитать разумное значение для maxPictureCleanupHeapUsage()? -- ммм... бросать дротики в дартс? :-) Серьезно, я действительно не знаю. В долгосрочной перспективе я надеюсь перенести всю обработку изображений в NDK, чтобы в первую очередь избавиться от кучи Dalvik/ART. maxPictureCleanupHeapUsage() — это лайфхак для тех, кто хочет избежать android:largeHeap="true", но за ним мало научных исследований. А недостатком является то, что это будет означать, что некоторые устройства могут не очищать изображения, что приводит к непоследовательному выводу. - person CommonsWare; 30.06.2014
comment
Я просто хочу добавить, что при использовании 1.0f в maxPictureCleanupHeapUsage() вы получите правильно ориентированное изображение, но оно вернется через 5-10 секунд, в зависимости от размера захвата. С другой стороны, использование 0.0f приведет к мгновенному возврату, но изображение может быть повернуто. Таким образом, зависит от того, хотите ли вы самостоятельно обрабатывать вращение, например сначала изменять размер, чем поворачивать (чтобы обрабатывать меньше пикселей), или выполнять вращение миниатюры на переднем плане, а затем вращение в полный размер в фоновом режиме, чтобы избавить пользователя от ожидания. - person John Pang; 12.12.2014
comment
@CommonsWare Документы для версии 2, похоже, не имеют ничего общего с OOM (или вообще с памятью). Я получаю OOM в версии 2, и хотя решение largeHeap работает, вы придумали другие способы справиться с этим? - person Shurikn; 01.07.2016
comment
@Shurikn: я не знаю, что такое версия 2. Если вы имеете в виду CWAC-Cam2, изолируйте работу камеры в своем собственном процессе. Если вы по-прежнему получаете OOM, дайте мне воспроизводимый сценарий, и я могу изучить его. - person CommonsWare; 01.07.2016
comment
@CommonsWare Я перестал тестировать библиотеку после того, как увидел, что она не работает для того, что мне нужно, поэтому я не могу ее воспроизвести, но вот что я помню: само приложение не падало, но я видел ошибки OOM в журналы, и казалось, что изображение не работает. Перестал видеть сообщение после изменения настройки largeHeap, и фотосъемка стала занимать больше времени, но работала. На самом деле я не могу подтвердить, действительно ли фотография не удалась в первый раз или нет. - person Shurikn; 02.07.2016
comment
@Shurikn: но я видел ошибки OOM в журналах, и мне показалось, что изображение не работает - OOM без диалогового окна сбоя означает, что попытка повернуть изображение не удалась. Однако вы все равно должны получить результат, возможно, с заголовком ориентации EXIF. OOM с диалоговым окном сбоя указывало бы на OOM где-то еще. - person CommonsWare; 02.07.2016