Interesting/ANDROID | Posted by hyena0 2009. 7. 25. 00:10

[Android] OpenGL 로 Sensor 이용하기


  OpenGL 로 Sensor 이용하기

  안드로이드 개발자 페이지에 있는 

  TouchRotateActivity.java 파일을 기반으로 

  나침반 센서를 이용해서 OpenGL 이미지를 회전 시키는 

  코드로 수정해봤습니다.

  Cube.java 파일은 마찬가지로 개발자 페이지에 있는 것을 

  참조하시면 됩니다.



  public class SensorRotateActivity extends Activity {


   @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        mGLSurfaceView = new SensorSurfaceView(this);

        

        setContentView(mGLSurfaceView);

        mGLSurfaceView.requestFocus();

        mGLSurfaceView.setFocusableInTouchMode(true);

        //

        mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 

        

    }


    @Override

    protected void onResume() {

        super.onResume();

        mGLSurfaceView.onResume();

        //sensor

        mSensorManager.registerListener(mListener,

    mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),

               SensorManager.SENSOR_DELAY_FASTEST);

    }


    @Override

    protected void onPause() {

        super.onPause();

        mGLSurfaceView.onPause();

    }

    

    // Sensor Stop 추가

    @Override

    protected void onStop()

    {

      mSensorManager.unregisterListener(mListener);

      super.onStop();

    }


    private SensorSurfaceView mGLSurfaceView;

    

    //Acc sensor

    //private static final String TAG = "Compass";


private SensorManager mSensorManager;

private final SensorEventListener mListener = new SensorEventListener() {

public void onSensorChanged(SensorEvent sensorEvent) {

float x = sensorEvent.values[2]; //0 - head , 1 - Pitch, 2 - roll

float y = sensorEvent.values[1]; 

//set scale

x = - x ;

y = - y ;

mGLSurfaceView.onSensor(x,y);

}

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

};

}


/**

 * Implement a simple rotation control by sensor.

 *

 */

class SensorSurfaceView extends GLSurfaceView {


    public SensorSurfaceView(Context context) {

        super(context);

        mRenderer = new CubeRenderer();

        setRenderer(mRenderer);

        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

    }


    public void onSensor(float x, float y){

    mRenderer.mAngleX = x; 

        mRenderer.mAngleY = y;

        requestRender();

    }

    


    /**

     * Render a cube. -> Cube.java 참조할 것 

     */

    private class CubeRenderer implements GLSurfaceView.Renderer {

        public CubeRenderer() {

            mCube = new Cube();

        }


        public void onDrawFrame(GL10 gl) {

           

            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);


            gl.glMatrixMode(GL10.GL_MODELVIEW);

            gl.glLoadIdentity();

            gl.glTranslatef(0, 0, -3.0f);

            gl.glRotatef(mAngleX, 0, 1, 0);

            gl.glRotatef(mAngleY, 1, 0, 0);


            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);


            mCube.draw(gl);

        }


        public int[] getConfigSpec() {

            

            int[] configSpec = {

                    EGL10.EGL_DEPTH_SIZE,   16,

                    EGL10.EGL_NONE

            };

            return configSpec;

        }


        public void onSurfaceChanged(GL10 gl, int width, int height) {

             gl.glViewport(0, 0, width, height);


             float ratio = (float) width / height;

             gl.glMatrixMode(GL10.GL_PROJECTION);

             gl.glLoadIdentity();

             gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);

        }


        public void onSurfaceCreated(GL10 gl, EGLConfig config) {

            

             gl.glDisable(GL10.GL_DITHER);


             gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,

                     GL10.GL_FASTEST);


             gl.glClearColor(1,1,1,1);

             gl.glEnable(GL10.GL_CULL_FACE);

             gl.glShadeModel(GL10.GL_SMOOTH);

             gl.glEnable(GL10.GL_DEPTH_TEST);

        }

        private Cube mCube;

        public float mAngleX;

        public float mAngleY;

    }


    private CubeRenderer mRenderer;

}

  

  OS 1.5 Cupcake 수동 업그레이드

  안드로이드 SDK 1.5 r3 가 릴리즈 되면서 

  실수로 다운그레이드를 해버렸기 때문에

  다시 Cupcake로 돌아가려하니까 자동 업데이트가

  기다리기 어려워 수동 업그레이드를 하기로 했습니다. 

  구글링을 해보면 대부분의 다운로드 링크가 깨어져 있더군요.

  하지만 여기 를 이용하면 될 것같네요.

  다운로드 받은 후 진행 사항은 다음과 같습니다.


 1. 파일명(signed-kila-ota-148830.de6a94ca.zip )을 update.zip 으로 변경한다.

 2. G1의 MicroSD 카드의 루트에 update.zip 파일을 복사한다.

 3. G1 의 전원을 끈다.

 4. G1의 Home 버튼과 Power 버튼을 동시에 눌러 켠다. (G1 로고 후에 삼각형 모양이 나타남)
 

 5.  키보드를 열어서 ALT 키와 L 키를 누른다.

 6. ALT 키와 S 키를 눌러 update.zip 파일을 업로드 시킨다.


 7. 설치되는 것을 기다렸다가 완료되면 Home 버튼과 Back 버튼을 눌러 Soft 리셋을 시킨다.


 그러면 몇번의 리부팅 후에 Cupcake 로 변신합니다.

 업데이트 완료되고 나니까 바로 릴리즈 3 을 업데이트 요청하는 군요...

 그래서 그것 마저 완료하고 다시 하루만에 정상으로 돌아왔습니다.


 휴~ 그래도 어제보단 덜 삽질했네요...^^

  ANDROID 1.5 R3 업데이트

  안드로이드 1.5 release 3가 업데이트 되었네요.

  G1 폰에도 갑자기 업데이트가 되었답니다.

  그런데, 주로 카메라 관련 어플을 만들고 있던 저로서는 

  당황스런 일이 발생했답니다.

  에러가 전혀 없는데도 불구하고 더이상 예기치 못한 오류로

  동작이 안되는 겁니다. 기존의 카메라는 잘 동작하는데

  이상하게 안되어서 에뮬레이터를 확인해 보니 정상동작하는 게 아니겠습니까...

  업데이트로 인해 정상동작이 안되는 것이었지요.

  G1폰이 문제인줄 알고선, 다운그레이드 하고 호들갑을 떨었는데,

  SDK가 업데이트 된 것을 나중에 알고 업데이트 해보니 에뮬레이터도 마찬가지의 오류가 발생하더군요.

  


카메라 오류

  그래서 어쨌던지 문제를 해결해야 했기 때문에 알아보니 이번 릴리즈 3에서는

  카메라를 동작시키려면 permission 을 강제적으로 확인한다는 군요.

When an application requests access to device camera (through android.hardware.camera), the CAMERA permission check is now properly enforced.

  그런데 아래와 같이 이미 적용되어 있었는데, 계속 오류가 나서 이상하다 했답니다.

<uses-permission android:name=”android.permission.CAMERA”/>


  그런데 확인해 보니 위치가 잘못되어 오동작 했던 거였답니다.

  그리고 이전에는 체크가 안되고 있어서 위치가 잘못되었는지 몰랐던 거죠.

  초심으로 돌아가서 정리하는 차원으로 Manifest file의 각 구문 위치를 정리합니다.

  괜한 삽질로 하루만 날렸군요. 게다가 1.5로 다시 업데이트 해야 하는데, 언제 자동으로 

  될런지 기다려야 할지 아니면 강제로 업데이트 해야 할지 고민됩니다.

  <?xml version="1.0" encoding="utf-8"?>
<manifest>

    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />

    <instrumentation />

    <uses-sdk />

    <application>

        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </activity-alias>

        <service>
            <intent-filter> . . . </intent-filter>
            <meta-data/>
        </service>

        <receiver>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </receiver>

        <provider>
            <grant-uri-permission />
            <meta-data />
        </provider>

        <uses-library />
        <uses-configuration />  

    </application>

</manifest>