Мне нужно проверить динамически, если используемое устройство поддерживает openGL ES 2.0. Как я могу это сделать?
Есть ли способ проверить, поддерживает ли Android-устройство openGL ES 2.0?
Ответ 1
Да. Следующий код выполнит трюк:
final ActivityManager activityManager =
(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo =
activityManager.getDeviceConfigurationInfo();
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
Прочтите это для получения дополнительной информации: http://www.learnopengles.com/android-lesson-one-getting-started/
Вам также может потребоваться запретить устройствам, не поддерживающим 2.0, видеть ваше приложение на рынке, добавив следующее к вашему манифесту:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
См. также документ uses-feature
.
Ответ 2
Помимо проверки кода другими способами, если вы хотите ограничить его на рынке ТОЛЬКО этими устройствами с 2.0, то в манифесте:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
Вы должны сделать то и другое, у меня были люди, которые устанавливали apk непосредственно на неподходящие устройства и приходилось иметь дело со странными исключениями. Теперь я запускаю runTime:
private boolean detectOpenGLES20() {
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo info = am.getDeviceConfigurationInfo();
return (info.reqGlEsVersion >= 0x20000);
}
//in activity onCreate
if (!detectOpenGLES20()) {
throw new RuntimeException("Open GL ES 2.0 was not found on device");
}
Ответ 3
Определение расширений OpenGL:
Реализации OpenGL различаются для Android-устройств с точки зрения расширений API OpenGL ES, которые поддерживаются. Эти расширения включают сжатие текстур, но обычно также включают в себя другие расширения для набора функций OpenGL.
Чтобы определить, какие форматы сжатия текстур и другие расширения OpenGL поддерживаются на определенном устройстве:
Запустите следующий код на целевых устройствах, чтобы определить, какие форматы сжатия текстур поддерживаются:
String extensions = javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
Предупреждение. Результаты этого разговора зависят от устройства! Вы должны запустить этот вызов на нескольких целевых устройствах, чтобы определить, какие типы сжатия обычно поддерживаются. Просмотрите результаты этого метода, чтобы определить, какие расширения OpenGL поддерживаются на устройстве.
Ответ 4
Вы можете использовать этот код в своем коде:
int result;
ActivityManager activityManager =
(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo configInfo = activityManager.getDeviceConfigurationInfo();
if (configInfo.reqGlEsVersion != ConfigurationInfo.GL_ES_VERSION_UNDEFINED) {
result= configInfo.reqGlEsVersion;
} else {
result= 1 << 16; // Lack of property means OpenGL ES version 1
}
Log.e("reqGlEsVersion", String.valueOf(result));
Log.e("getGlEsVersion", configInfo.getGlEsVersion());
Ответ 5
Никогда не использовался OpenGL ES, но видел, что он имеет тот же метод glGetString
, что и OpenGL. Он должен сделать трюк:
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetString.xml
Ответ 6
Этот код работает отлично..
// Check if the system supports OpenGL ES 2.0.
final ActivityManager activityManager = ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo = activityManager
.getDeviceConfigurationInfo();
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
if (supportsEs2) {
Log.i("JO", "configurationInfo.reqGlEsVersion:"
+ configurationInfo.reqGlEsVersion + "supportsEs2:"
+ supportsEs2);
// Request an OpenGL ES 2.0 compatible context.
myGlsurfaceView.setEGLContextClientVersion(2);
final DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
// Set the renderer to our demo renderer, defined below.
myRenderer = new MyRenderer(this, myGlsurfaceView);
} else {
// This is where you could create an OpenGL ES 1.x compatible
// renderer if you wanted to support both ES 1 and ES 2.
return;
}
Ответ 7
Некоторое время я искал тот же ответ. Но, к сожалению, я не мог найти для этого подходящего описания. Я только что нашел минуту назад, и мне кажется, что я хотел бы поделиться им со всеми.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FeatureInfo[] list = this.getPackageManager()
.getSystemAvailableFeatures();
Toast.makeText(this,
"OpenGL ES Version: " + list[list.length - 1].getGlEsVersion(),
Toast.LENGTH_LONG).show();
}