有没有办法检查Android设备是否支持openGL ES 2.0?

时间:2012-02-08 17:22:19

标签: android opengl-es opengl-es-2.0

我需要动态检查所用设备是否支持openGL ES 2.0。 我怎么能这样做?

7 个答案:

答案 0 :(得分:36)

是。以下代码将起到作用:

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" />

另见the doc of uses-feature

答案 1 :(得分:5)

除了以其他人提到的方式检入代码之外,如果你想在市场上将它重新转移到只有那些带有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");
    }

答案 2 :(得分:2)

确定OpenGL扩展程序:

OpenGL的实现因Android设备在支持的OpenGL ES API扩展方面而异。这些扩展包括纹理压缩,但通常还包括OpenGL功能集的其他扩展。

确定特定设备支持的纹理压缩格式和其他OpenGL扩展:

在目标设备上运行以下代码,以确定支持哪种纹理压缩格式:

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

警告:此通话的结果因设备而异!您必须在多个目标设备上运行此调用,以确定通常支持的压缩类型。 查看此方法的输出以确定设备支持哪些OpenGL扩展。

答案 3 :(得分:2)

您可以在代码中使用此代码:

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

答案 4 :(得分:0)

从未使用OpenGL ES,但看到它与OpenGL具有相同的glGetString方法。它应该做的伎俩:

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

答案 5 :(得分:0)

此代码工作正常..

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

答案 6 :(得分:0)

有一段时间,我也一直在寻找相同的答案。但不幸的是,我无法找到适当的描述。我一分钟前就找到了自己的方式,我觉得我想与大家分享。

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