Есть ли способ проверить, поддерживает ли Android-устройство openGL ES 2.0?

Мне нужно проверить динамически, если используемое устройство поддерживает openGL ES 2.0. Как я могу это сделать?

Да. Следующий код сделает трюк:

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.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"); } 

Определение расширений OpenGL:

Реализации OpenGL различаются для Android-устройств с точки зрения расширений API OpenGL ES, которые поддерживаются. Эти расширения включают сжатие текстур, но обычно также включают другие расширения в набор функций OpenGL.

Чтобы определить, какие форматы сжатия текстур и другие расширения OpenGL поддерживаются на определенном устройстве:

Запустите следующий код на целевых устройствах, чтобы определить, какие форматы сжатия текстур поддерживаются:

  String extensions = javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS); 

Предупреждение: результаты этого разговора зависят от устройства! Вы должны запустить этот вызов на нескольких целевых устройствах, чтобы определить, какие типы сжатия обычно поддерживаются. Просмотрите выход этого метода, чтобы определить, какие расширения OpenGL поддерживаются на устройстве.

Вы можете использовать этот код в своем коде:

  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()); 

Никогда не использовался OpenGL ES, но видел, что он имеет тот же метод glGetString что и OpenGL. Он должен сделать трюк:

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetString.xml

Этот код работает отлично ..

  // 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; } 

Некоторое время я искал тот же ответ. Но, к сожалению, я не мог найти для этого подходящего описания. Я только что нашел минуту назад, и мне кажется, что я хотел бы поделиться им со всеми.

 @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(); } 
Intereting Posts
Изображения WebView не отображаются с помощью HTTPS Эффект слайда на ExpandableListView Многопоточная правильность: использование синхронизированного блока Является ли приложение Android для удаления батареи? Лучшая практика для ссылки на родительскую активность фрагмента? Вопросы об Android Unit Test с студией gradle или android Разница между перегрузкой и перегрузкой? Добавление фона в сцену Andengine Android Проблема Cordova inAppBrowser «Тип ресурса» для выпуска сборки Пользовательские маркеры, показывающие белый цвет на некоторых устройствах (Google Maps v3 Android SDK) Как узнать, подключен ли Wi-Fi на Android? Видеофайл Playng присутствует в локальной файловой системе на Android Чтобы загрузить большой файл, который лучше подходит для использования AsyncTask или Thread? Можно ли использовать инфразвук просмотра для раздувания отдельных предметов? Android VectorDrawable как составные чертежи