Java .Lang.IllegalArgumentException: неверный формат растрового изображения с перерывами при запуске - PullRequest
1 голос
/ 02 февраля 2020

Я выполняю стресс-тестирование на множестве android устройств с использованием Firebase Testlab и получаю необычное исключение (на некоторых облачных тестовых устройствах), которое приводит к появлению черного экрана при загрузке текстур при запуске. У нас есть основное действие onCreate (), генерирующее MainPage, которое затем запускает Init (), который загружает текстуры. Он также сбрасывает текстуры onPause и перезагружает onResume, снова вызывая Init (). Вот ошибка:

Java.Lang.IllegalArgumentException: invalid Bitmap format
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at offset 12
at Java.Interop.JniEnvironment.StaticMethods.CallStaticVoidMethod(Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) at offset 110
at Java.Interop.JniPeerMembers.JniStaticMethods.InvokeVoidMethod(System.String encodedMember, Java.Interop.JniArgumentValue* parameters) at offset 24
at Android.Opengl.GLUtils.TexImage2D(System.Int32 target, System.Int32 level, Android.Graphics.Bitmap bitmap, System.Int32 border) at offset 112
at DoodleSmash.Droid.MainActivity.LoadTexture(System.String name) at offset 65
at DoodleSmash.MainPage.Init() at offset 689

Кажется, что растровое изображение имеет неправильный формат, но я никогда не видел эту проблему с другими устройствами, я запускал эмуляторы и несколько физических устройств локально. Вот код загрузки текстуры:

public int LoadTexture(string name)
        {
            var assembly = IntrospectionExtensions.GetTypeInfo(typeof(MainActivity)).Assembly;
            System.IO.Stream stream = assembly.GetManifestResourceStream("DoodleSmash.Droid." + name);

            Android.Graphics.Bitmap bm = Android.Graphics.BitmapFactory.DecodeStream(stream);

            int tex;
            GL.GenTextures(1, out tex);
            GL.BindTexture(TextureTarget.Texture2D, tex);

            GLUtils.TexImage2D((int)TextureTarget.Texture2D, 0, bm, 0);

            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);

            return tex;
        }

TexImage2D - функция, которая, по-видимому, дает сбой, я действительно не знаю, почему. Любые идеи? Это периодически и происходит при запуске, непоследовательно. Все изображения PNG. Может быть, мне нужно сначала очистить всю текстурную память в функции onCreate? Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 02 февраля 2020

Я понял, что формат растрового изображения должен быть ARGB_8888 для более старых API и старых телефонов, это можно сделать, изменив неизменное растровое изображение с помощью:

Bitmap bmp_Copy = bmp_Base.copy(Bitmap.Config.ARGB_8888,true);

, а затем просто перезапустите старый.

Ответ пришел от: Преобразование неизменяемого растрового файла в изменяемое растровое изображение

...