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

#android #commonsware-cwac

#Android #commonsware-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 amp;amp; 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)
  

Ответ №1:

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

Комментарии:

1. Работает отличная большая куча. Как мне рассчитать разумное значение для maxPictureCleanupHeapUsage() ?

2. @user2130951: «Как мне рассчитать разумное значение для maxPictureCleanupHeapUsage () ?» — ммм … бросать дротики в дартс? 🙂 Серьезно, я действительно не знаю. В долгосрочной перспективе я надеюсь перенести всю обработку изображений в NDK, чтобы в первую очередь избавиться от кучи Dalvik / ART. Это maxPictureCleanupHeapUsage() хак для тех, кто хочет избежать android:largeHeap="true" , но за ним не так много научного анализа. И недостатком является то, что это будет означать, что некоторые устройства могут не очищать изображения, что приведет к непоследовательному выводу.

3. Я просто хочу добавить, что — используя 1.0f in maxPictureCleanupHeapUsage() , вы получите правильно ориентированное изображение, но для его возврата потребуется 5-10 секунд, в зависимости от размера захвата. С другой стороны, использование 0.0f приведет к мгновенному возврату, но изображение может быть повернуто. Итак, зависит от того, хотите ли вы самостоятельно обрабатывать поворот, например, сначала изменить размер, а затем повернуть (чтобы обрабатывать меньше пикселей), или выполнить поворот миниатюр на переднем плане, а затем полноразмерный поворот в фоновом режиме, чтобы избавить пользователя от ожидания.

4. @CommonsWare документы для версии 2, похоже, не имеют ничего общего с ООМ (или памятью вообще). Я получаю ООМ в версии 2, и, хотя решение largeHeap работает, вы придумали другие способы решения этой проблемы?

5. @Shurikn: Я не знаю, что такое «версия 2». Если вы имеете в виду CWAC-Cam2 , изолируйте работу камеры в ее собственном процессе . Если вы все еще получаете ООМ, дайте мне воспроизводимый сценарий , и я смогу его изучить.