Android: фатальный сигнал 11 (SIGSEGV) в 0x00000000 (код =1) на movie.draw

Я пытаюсь отобразить анимированный GIF в ImageView с использованием класса Android Movie в методе onDraw следующим образом:

   @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.TRANSPARENT);
        super.onDraw(canvas);
        long now = android.os.SystemClock.uptimeMillis();
        if (movieStart == 0) {
            movieStart = now;
        }
        movie = getMovieFromGif();
        if (movie != null && movie.duration() > 0) {
            try {
                int relTime = (int) ((now - movieStart) % movie.duration());
                movie.setTime(relTime);

                float movie_height = convertDpToPixels(movie.height());
                float movie_width = convertDpToPixels(movie.width());

                float new_movie_height = movie_height;
                float new_movie_width = movie_width;
                float movie_ratio = movie_width / movie_height;

                if (new_movie_width > container_width) {
                    new_movie_width = container_width;
                    new_movie_height = new_movie_width / movie_ratio;
                }

                if (new_movie_height > container_height) {
                    new_movie_height = container_height;
                    new_movie_width = new_movie_height * movie_ratio;
                }

                float scale_x = container_width / new_movie_width;
                float scale_y = container_height / new_movie_height;

                scale_x = new_movie_width / (float) movie.width();
                scale_y = new_movie_height / (float) movie.height();

                canvas.scale(scale_x, scale_y);
                float x = 0;
                if ((float) this.getWidth() > new_movie_width) {
                    x = ((this.getWidth() - (movie.width() * scale_x)) / 2f)
                            / scale_x;
                }

                movie.draw(canvas, x, 0);
                this.invalidate();
            } catch (Exception ex) {
                Log.i("onDraw()", "Error: " + ex.getMessage());
            }
        }
}

Код работает нормально на большинстве устройств, но на Huawei Ascend P7 и Samsung galaxy a5 происходит сбой приложения на movie.draw(canvas, x, 0) за исключением:

A / libc (23632): фатальный сигнал 11 (SIGSEGV) в 0x00000000 (код =1), поток 23632

Есть идеи, что не так с movie.draw на этих устройствах?

ОБНОВЛЕНО: Ниже приведена полная трассировка стека

04-29 12:09:24.979: D/Activity(18951): #2 установить trueTransGradationModeColor в true
04-29 12:09:25.049: I/Adreno-EGL(18951):: EGL 1.4 QUALCOMM build: ()
04-29 12:09:25.049: I/Adreno-EGL(18951): версия шейдерного компилятора OpenGL ES: E031.24.02.07
04-29 12:09:25.049: I/Adreno-EGL(18951): дата сборки: 08.06.14 ср
04-29 12:09:25.049: I/Adreno-EGL(18951): местное отделение: rb1
04-29 12:09:25.049: I/Adreno-EGL(18951): удаленный филиал:
04-29 12:09:25.049: I/Adreno-EGL(18951): локальные патчи:
04-29 12:09:25.049: I/Adreno-EGL(18951): реконструировать филиал:
04-29 12: 09: 25.079: D / OpenGLRenderer (18951): включение режима отладки 0
04-29 12: 09: 25.109: D / skia (18951): streamToByte: входное изображение формата agif размером более 30 МБ.
04-29 12: 09: 25.109: D / skia (18951): streamToByte: Quram agif - длина: 10473
04-29 12: 09: 25.109: D / skia (18951): Wink AGIF Move Конструктор Конец 9, всегоВремя: 2700
04-29 12: 09: 25.109: A / libc (18951): фатальный сигнал 11 (SIGSEGV) при 0x00000000 (код =1), поток 18951 (com.android.gif)

Фатальная ошибка сигнала возникает после выполнения кода movie.draw(), rest - это трассировка стека выполнения строк перед movie.draw().

2 ответа

Решение

Я смог решить проблему, отключив аппаратное ускорение Android:

андроид:hardwareAccelerated="ложь"

Это то же самое, что и Naheed Sultana, но удивительно, что это не сработало для меня, пока этот сработал. именно здесь вы отключаете аппаратный ускоритель только в этом конкретном виде, в котором вы рисуете фильм, используя эту линию.

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
Другие вопросы по тегам