Мне нужно отобразить некоторые изображения в ImageView. Некоторые из них могут иметь слишком высокое разрешение, которое дает мне
W/OpenGLRenderer﹕ Bitmap too large to be uploaded into a texture (3744x5616, max=4096x4096)
Я использовал этот метод для обнаружения этой ситуации:
public boolean isResTooHigh() {
int[] maxSize = new int[1];
GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0);
return (maxSize[0] < width) || (maxSize[0] < height);
}
где ширина и высота предоставляются источником изображений.
Но теперь на моем Nexus 4 работает Lollipop и мои эмуляторы, maxSize [0] всегда 0. Итак, как я могу обнаружить эту проблему?
Этот запрос GL требует активного контекста GL в потоке. Раньше ваше приложение случайно использовало контекстный интерфейс GL для выполнения этого запроса. В Lollipop из-за различных изменений архитектуры этот контекст больше не течет в код приложения, поэтому запрос теперь терпит неудачу. Если вы посмотрите в logcat, вы, вероятно, увидите что-то вроде: "вызов opengl es api без текущего контекста".
Вы можете создать свой собственный контекст GL для выполнения этого запроса, если хотите. В качестве альтернативы вы можете предположить, что разрешение экрана является максимальным, или используйте масштабируемое решение, такое как черепичный подход.
Технически вы гарантированно сможете отображать только одно растровые изображения, размер которых меньше или меньше. Возможно, вы сможете сделать больше на некоторых аппаратных средствах, но это непредсказуемо - и, как я уже сказал, единственная реальная гарантия заключается в том, что вы сможете отобразить что-то размером экрана (или меньше).
Чтобы отображать большие изображения, разделите свой пользовательский интерфейс на плитки, каждый из которых не больше экрана в любом измерении.