2012-02-08 59 views
23

Tôi cần kiểm tra động nếu thiết bị được sử dụng hỗ trợ OpenGL ES 2.0. Tôi có thể làm như thế nào?Có cách nào để kiểm tra xem thiết bị Android có hỗ trợ OpenGL ES 2.0 không?

+0

GLES20 được thêm vào trình độ API 8, không nên nó là đủ để kiểm tra chống lại nó để thay thế? – harism

+2

harism: Điều đó không đúng. Tôi có HTC Wildfire với Android 2.2.1. Nó không hỗ trợ OpenGL ES 2.0. – petrnohejl

Trả lời

33

Có. Các mã sau đây sẽ làm các trick:

final ActivityManager activityManager = 
    (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
final ConfigurationInfo configurationInfo = 
    activityManager.getDeviceConfigurationInfo(); 
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000; 

đọc này cho biết thêm: http://www.learnopengles.com/android-lesson-one-getting-started/

Bạn cũng có thể yêu cầu muốn hạn chế các thiết bị không hỗ trợ 2,0 từ nhìn thấy ứng dụng của bạn trên thị trường bằng cách thêm nội dung sau đây cho tệp kê khai của bạn:

<uses-feature android:glEsVersion="0x00020000" android:required="true" /> 

Xem thêm the doc of uses-feature.

+0

getDeviceConfigurationInfo() trả về một ConfigurationInfo, theo thông số kỹ thuật là: 'Thông tin bạn có thể truy xuất về tùy chọn cấu hình phần cứng được khai báo bởi một ứng dụng. Điều này tương ứng với thông tin được thu thập từ thẻ của AndroidManifest.xml. Vì vậy, có vẻ như đây là những yêu cầu thiết bị bạn đã thêm vào ứng dụng của mình thay vì đó là thông tin về thiết bị. – jeroent

+0

@jeroent Đó là những gì lớp 'ConfigurationInfo' nêu trong thông số kỹ thuật của nó nhưng sử dụng bối cảnh 'ACTIVITY_SERVICE' trong 'getSystemService' truy xuất 'ActivityManager' để tương tác với trạng thái hệ thống toàn cầu. – Foggzie

+0

Xin lỗi? Và làm thế nào để kiểm tra nếu hỗ trợ 3.0 –

2

Xác định phần mở rộng OpenGL:

Triển khai của OpenGL khác nhau tùy theo điện thoại Android về các phần mở rộng cho API OpenGL ES được hỗ trợ. Các tiện ích mở rộng này bao gồm nén kết cấu, nhưng thường cũng bao gồm các phần mở rộng khác cho bộ tính năng OpenGL.

Để xác định các định dạng nén, và phần mở rộng OpenGL khác gì kết cấu, được hỗ trợ trên một thiết bị cụ thể:

Chạy đoạn mã sau trên các thiết bị mục tiêu của bạn để xác định những định dạng nén kết cấu được hỗ trợ:

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

Cảnh báo: Kết quả của cuộc gọi này khác nhau tùy theo thiết bị! Bạn phải chạy cuộc gọi này trên một số thiết bị đích để xác định loại nén nào thường được hỗ trợ. Xem lại đầu ra của phương pháp này để xác định tiện ích OpenGL nào được hỗ trợ trên thiết bị.

+1

Phương pháp này được phức tạp. Nếu bạn đang sử dụng glGetString(), bạn sẽ không gọi nó với GL_EXTENSIONS, bạn sẽ gọi nó với GL_VERSION và sau đó phân tích cú pháp chuỗi sau đó. Lớp ConfigurationInfo được thiết kế để giải quyết vấn đề này một cách nhanh chóng và dễ dàng. – Foggzie

5

Ngoài việc kiểm tra trong mã theo những cách mà người khác đã đề cập, nếu bạn muốn restrct nó trên thị trường để chỉ những thiết bị với 2,0 sau đó trong manifest:

<uses-feature android:glEsVersion="0x00020000" android:required="true" /> 

Bạn nên làm cả hai, tôi đã yêu cầu mọi người cài đặt gói ứng dụng trực tiếp vào thiết bị không phù hợp và phải đối phó với các ngoại lệ lạ. Bây giờ tôi ném một 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"); 
    } 
0

Mã này làm việc Fine ..

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

Đối với một thời gian, tôi đã tìm kiếm câu trả lời tương tự, quá. Nhưng thật không may, tôi không thể tìm thấy một mô tả thích hợp cho điều đó. Tôi đã tự tìm ra cách đây một phút, và tôi cảm thấy tôi muốn chia sẻ nó với mọi người.

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

Bạn có thể sử dụng mã này trong mã của bạn:

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

mục này phải được chấp nhận làm câu trả lời – Bunny

Các vấn đề liên quan