Сигнал об ошибке Android 11 при просмотре фильма на холсте

Я разрабатываю приложение для Android, в котором я пытаюсь отобразить изображение в формате GIF. Для этого я использую класс Movie и создал класс GIFView, который расширяет View. Я получил экземпляр Movie из метода Movie.decodeFile.

Я получаю сообщение об ошибке при вызове Movie.draw (canvas).

04-28 13:44:18.001: A/libc(24883): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 24883 (mple.channel002) 

Есть соответствующий код:

    public void setGif(File gif)
    {
        movie = Movie.decodeFile(gif.getAbsolutePath());
    }

    @Override
    public void draw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.draw(canvas);
        canvas.drawColor(0xFFCC3C6C);            

        if(movie != null)
        {
            if(movieStart == 0)
                movieStart = android.os.SystemClock.uptimeMillis();
            int duration = Math.max(movie.duration(), 1000);
            movie.setTime((int)(duration - ((android.os.SystemClock.uptimeMillis() - movieStart)%duration)));

            movie.draw(canvas, 10, 10);//TODO CRASH

            invalidate();
        }
    }

Я создаю GIFView в основном, вызываю метод setGIF выше, чтобы дать ему путь и добавляю его к макету с параметром FillParent. Это работает, когда я печатаю это изображение в ImageView. Рисование рисованного на холсте вместо GIF тоже работает. Таким образом, проблема, кажется, касается экземпляра Movie.

Я использовал эти ссылки, чтобы сделать GIFView http://weavora.com/blog/2012/02/07/android-and-how-to-use-animated-gifs/

Я тоже так пробовал, но та же ошибка на movie.draw Информация о классе Movie для Android

РЕДАКТИРОВАТЬ1: я делаю свои тесты на Oppo Find 7a на Android 4.4.2 / snapdragon 801 / 2GB. Изменение movie.draw(canvas, 10, 10) на movie.draw(canvas, 10f, 10f) ничего не меняет.

EDIT2: я только что проверил на старом устройстве ZTE с Android 2.3.5, и он работал.. Так что что-то не так при запуске на устройстве Find7a, но я не могу понять, что:(

2 ответа

Решение

В КОНЦЕ КОНЦОВ! Я нашел ответ, похоже, что на некоторых версиях Android или устройствах аппаратное ускорение необходимо отключить.
Я просто добавил это в мой манифест:

<application android:hardwareAccelerated="true" ...>

Более подробную информацию об использовании / отключении аппаратного ускорения можно найти здесь.

Я нашел другое решение - вы должны отключить аппаратный ускоритель только в этом конкретном виде вы рисуете фильм. Используйте следующую строку:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

Ссылка (уровень просмотра) https://developer.android.com/guide/topics/graphics/hardware-accel.html

Другие вопросы по тегам