Сигнал об ошибке 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