4

解決策を見つけるためにインターネット全体を何日も検索しましたが、何も得られませんでした。

Android デバイス (RENDERER、VENDOR、VERSION など) の GPU に関する主な情報を取得し、定義された 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);         
    }
}
}

これはうまく機能しますが、それらのログをテキストビューに入れる方法がわかりません。GLSurfaceView に ContentView を設定するそこで TextView を使用する方法がわかりません。

私も使ってみました:

String renderer = gl.glGetString(GL10.GL_VENDOR);
Log.d("GL", renderer);

以前のログと同じ場所で、これもうまく機能し、LogCat でベンダーの正しい価値を確認できます。

それでも、この値をテキストビュー (tv.setText(renderer) など) に渡し、通常のレイアウトで使用する方法がわかりません。

誰かが簡単な例でこの問題を解決するのを手伝ってくれたら、とても感謝しています。私は OpenGL を使用したことがなく、OpenGL に関する情報のみを取得したいということを考慮してください。また、その情報を取得する別の方法 (できればもっと簡単に:D) を教えていただければ、それも承ります。

前もって感謝します。

4

3 に答える 3

4

少しトリッキーですが、 root にする必要はありません。そうしないと、レイアウトでGlSurfaceView事前に定義されていません。TextView

解決:

これが私がどうにかして行う方法ですGlSurfaceView。事前定義されたレイアウトに追加し、情報が終わったら削除しました。

xmlファイルは、事前定義された次のようになりますTextView

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

    }
}

参考になれば幸いです!!

于 2013-12-10T13:07:51.913 に答える
2

最後に、この問題に苦労した後、可能な解決策を見つけました。多分それは最高ではありませんが、私は他に持っていなかったのでうまくいきました.

共有設定を使用して情報を保存しました。実装された 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);

この回答が同じ問題を抱えている人々に役立つことを願っています。他のソリューションも役立ちます。

于 2013-08-27T10:35:56.250 に答える