为了找到解决方案,我在整个互联网上搜索了好几天,但一无所获。
我想在Android设备上获得有关GPU的主要信息(如RENDERER、VENDOR和VERSION),并能够在定义的XML布局上的文本视图上打印它。我尝试了很多方法,但都不起作用。每个人都说要使用这个:
Log.d("GL", "GL_RENDERER = " + gl.glGetString(GL10.GL_RENDERER));
Log.d("GL", "GL_VENDOR = " + gl.glGetString(GL10.GL_VENDOR));
Log.d("GL", "GL_VERSION = " + gl.glGetString(GL10.GL_VERSION));
Log.i("GL", "GL_EXTENSIONS = " + gl.glGetString(GL10.GL_EXTENSIONS));
我实现了下一个类:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGLView = new GLSurfaceView(this);
mGLView.setRenderer(new ClearRenderer());
setContentView(mGLView);
}
private GLSurfaceView mGLView;
static class ClearRenderer implements GLSurfaceView.Renderer {
public final static String renderer = null;
Random aleatorio = new Random();
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
float r = aleatorio.nextFloat();
float g = aleatorio.nextFloat();
float b = aleatorio.nextFloat();
gl.glClearColor(r, g, b, 1.0f);
Log.d("GL", "GL_RENDERER = " + gl.glGetString(GL10.GL_RENDERER));
Log.d("GL", "GL_VENDOR = " + gl.glGetString(GL10.GL_VENDOR));
Log.d("GL", "GL_VERSION = " + gl.glGetString(GL10.GL_VERSION));
Log.i("GL", "GL_EXTENSIONS = " + gl.glGetString(GL10.GL_EXTENSIONS));
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
}
public void onDrawFrame(GL10 gl) {
gl.glClear(gl.GL_COLOR_BUFFER_BIT);
}
}
}
这很好,但我不知道如何将这些日志放入文本视图中。将ContentView设置为我的GLSurfaceView我不知道如何在那里使用TextView。
我也试过使用:
String renderer = gl.glGetString(GL10.GL_VENDOR);
Log.d("GL", renderer);
在以前的日志所在的地方,它也很好用,我可以在LogCat中看到供应商的正确价值。
但是,我仍然不知道如何将这个值传递给文本视图(例如,tv.setText(renderer)),并在正常布局中使用它。
如果有人能用一个简单的例子帮我解决这个问题,我将不胜感激。考虑到我从未使用过OpenGL,我只想获得有关它的信息。如果你告诉我另一种获取信息的方式(如果可能的话更容易:D),我也接受。
提前谢谢。
这有点棘手,您不需要将GlSurfaceView
作为根目录,否则布局中将不会有预定义的TextView
。
解决方案:
这就是我设法做到的,我在预定义的布局中添加了GlSurfaceView
,然后在处理完信息后将其删除。
使用预定义的TextView
:,您的xml
文件将看起来像这样
gpu_info.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rlRoot"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tvVendor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF0000"
/>
并且您的Activity
文件将如下所示:
public class GpuInfoActivity extends Activity{
private RelativeLayout rlRoot;
private TextView tvVendor;
private String mVendor;
private GLSurfaceView mGlSurfaceView;
private GLSurfaceView.Renderer mGlRenderer = new Renderer() {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {// TODO Auto-generated method stub
Log.d(TAG, "gl renderer: "+gl.glGetString(GL10.GL_RENDERER));
Log.d(TAG, "gl vendor: "+gl.glGetString(GL10.GL_VENDOR));
Log.d(TAG, "gl version: "+gl.glGetString(GL10.GL_VERSION));
Log.d(TAG, "gl extensions: "+gl.glGetString(GL10.GL_EXTENSIONS));
mVendor = gl.glGetString(GL10.GL_VENDOR);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvVendor.setText(mVendor);
rlRoot.removeView(mGlSurfaceView);
}
});}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gpu_info);
rlRoot = (RelativeLayout)findViewById(R.id.rlRoot);
tvVendor = (TextView)findViewById(R.id.tvVendor);
mGlSurfaceView = new GLSurfaceView(this);
mGlSurfaceView.setRenderer(mGlRenderer);
rlRoot.addView(mGlSurfaceView);
}
}
我希望它会有所帮助!!
在解决了这个问题之后,我终于找到了一个可能的解决方案。也许这不是最好的,但我没有其他选择,它奏效了。
我使用共享的首选项来存储信息。我用实现的GLSurfaceView创建了一个启动器活动,延迟了3秒(足以存储所有字符串),在这个延迟之后,我需要启动活动。
启动器活动如下所示:
package system.info.to.txt;
import java.util.Random;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
public class RendererLoader extends Activity {
private static SharedPreferences prefs;
private static SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
prefs = this.getSharedPreferences("GPUinfo", Context.MODE_PRIVATE);
mGLView = new GLSurfaceView(this);
mGLView.setRenderer(new ClearRenderer());
setContentView(mGLView);
final Intent intent = new Intent(this, Info.class);
new CountDownTimer(3000, 9999)
{
public void onTick(long millisUntilFinished) {
// Not used
}
public void onFinish() {
startActivity(intent);
finish();
}
}.start();
}
private GLSurfaceView mGLView;
class ClearRenderer implements GLSurfaceView.Renderer {
Random aleatorio = new Random();
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
float r = aleatorio.nextFloat();
float g = aleatorio.nextFloat();
float b = aleatorio.nextFloat();
gl.glClearColor(r, g, b, 1.0f);
editor = prefs.edit();
editor.putString("RENDERER", gl.glGetString(GL10.GL_RENDERER));
editor.putString("VENDOR", gl.glGetString(GL10.GL_VENDOR));
editor.putString("VERSION", gl.glGetString(GL10.GL_VERSION));
editor.putString("EXTENSIONS", gl.glGetString(GL10.GL_EXTENSIONS));
editor.commit();
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
}
}
之后,您可以使用在应用程序中任意位置检索存储的字符串
SharedPreferences prefs =getSharedPreferences("GPUinfo",Context.MODE_PRIVATE);
String vendor = prefs.getString("VENDOR", null);
String renderer = prefs.getString("RENDERER", null);
String version = prefs.getString("VERSION", null);
String extensions = prefs.getString("EXTENSIONS", null);
我希望这个答案对有同样问题的人有用。任何其他解决方案也会有所帮助。
我会这样做:
package com.paget96.lspeed.activities;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import java.util.Random;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class GetGpuInfo extends Activity {
// Variables
private static SharedPreferences sharedPreferences;
private static SharedPreferences.Editor editor;
private GLSurfaceView mGLView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sharedPreferences = this.getSharedPreferences("device_info", Context.MODE_PRIVATE);
mGLView = new GLSurfaceView(this);
mGLView.setRenderer(new ClearRenderer());
setContentView(mGLView);
final Intent intent = new Intent(this, MainActivity.class);
}
class ClearRenderer implements GLSurfaceView.Renderer {
Random random = new Random();
@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
float r = random.nextFloat();
float g = random.nextFloat();
float b = random.nextFloat();
gl10.glClearColor(r, g, b, 1.0f);
editor = sharedPreferences.edit();
editor.putString("gpu_vendor", gl10.glGetString(GL10.GL_VENDOR));
editor.putString("gpu_renderer", gl10.glGetString(GL10.GL_RENDERER));
editor.putString("gpu_version", gl10.glGetString(GL10.GL_VERSION));
//editor.putString("gpu_extensions", gl10.glGetString(GL10.GL_EXTENSIONS));
editor.apply();
finish();
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
}
}
然后通过Intent将相同的活动调用给任何其他活动(只要传递onSurfaceCreated(…)中的所有内容,该活动就会被销毁
final Intent intent = new Intent(this, GetGpuInfo.class);
startActivity(intent);
现在,activity GetGpuInfo activity已经将GPU数据收集到sharedPreferences,因此您可以访问任何片段等。像这样:
vendor = sharedPreferences.getString("gpu_vendor", getActivity().getString(R.string.unknown));
renderer = sharedPreferences.getString("gpu_renderer", getActivity().getString(R.string.unknown));
version = sharedPreferences.getString("gpu_version", getActivity().getString(R.string.unknown));
extensions = sharedPreferences.getString("gpu_extensions", getActivity().getString(R.string.unknown));
gpuInfo.setText(String.format("%sn%sn%s",
getString(R.string.vendor, vendor),
getString(R.string.renderer, renderer),
getString(R.string.version, version)
/*,getString(R.string.extensions, extensions)*/));
将sharedPreferences的getter初始化为String,然后可以像我在这里所做的那样将它们放在TextView中。我之所以使用String.format,是因为使用新行更容易,而不会出现字符串集中的警告。
仅此而已,欢呼