使用しているデバイスが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");
}
このコードをコードで使用できます。
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拡張機能の決定:
OpenGLの実装は、サポートされるOpenGL ES APIの拡張機能の点でAndroidデバイスによって異なります。これらの拡張機能には、テクスチャ圧縮が含まれますが、通常、OpenGL機能セットの他の拡張機能も含まれます。
特定のデバイスでサポートされているテクスチャ圧縮形式とその他のOpenGL拡張機能を確認するには:
ターゲットデバイスで次のコードを実行して、サポートされているテクスチャ圧縮形式を確認します。
String extensions = javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
警告:この呼び出しの結果はデバイスによって異なります!この呼び出しをいくつかのターゲットデバイスで実行して、一般的にサポートされている圧縮タイプを判別する必要があります。このメソッドの出力を確認して、デバイスでサポートされているOpenGL拡張機能を確認します。
OpenGL ESを使用したことはありませんが、OpenGLと同じglGetString
メソッドがあることを確認しました。それはトリックをするべきです:
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();
}