안드로이드 기기에서 Orientation 이벤트를 받아 윈도우 응용 프로그램(WPF)으로 소켓통신을 통해 전송하여 프로그램입니다.

 

 

-

 

 

안드로이드

1. 안드로이드 기기에서 방향 센서 이벤트를 수신

2. 소켓 통신을 통해 윈도우 응용 프로그램(WPF)로 센서 데이터 송신

 

프로젝트 :Android_AboutRotation.zip

 

 

 

 

 

윈도우 응용프로그램(WPF)

1. 안드로이드에서 받은 X,Y,Z 데이터를 개체에 적용

 

 

 

프로젝트 :WPF_AboutAndroidOrientation.zip

 

 

 

개판소스이므로 잘... 참고하세요...^^;

 

 

TYPE_ORIENTATION을 이용해서 안드로이드 기기의 방향을 쉽게 얻을 수 있습니다.

 

 

sm = (SensorManager)this.getSystemService(Context.SENSOR_SERVICE);

        gyroSensor = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);

        gyroListener = new SensorEventListener() {

                      

                       @Override

                       public void onSensorChanged(SensorEvent event) {

                              // TODO Auto-generated method stub

                              float[] values = event.values;

                              //float x= values[0];

                              //float y = values[1];

                              //float z = values[2];

                       }

                      

                       @Override

                       public void onAccuracyChanged(Sensor sensor, int accuracy) {

                              // TODO Auto-generated method stub

                             

                       }

               };

 

 

 

그런데 Warning을 살펴보시면 아래와 같은 메세지를 확인 할 수 있습니다.

 

The field Sensor.TYPE_ORIENTATION is deprecated

 

향후에 언제 지원을 멈출지 모르는 불안한 메세지..!

 

방향을 얻기위해서는 TYPE_ACCELEROMETER와 TYPE_MAGNETIC_FIELD를 이용해 이벤트를 등록해야합니다.

 

아래는 샘플코드입니다.

 

 

import android.app.Activity;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.os.Bundle;

import android.view.View;

 

public class CompassActivity extends Activity implements SensorEventListener {

 

  Float azimut;  // View to draw a compass

 

  public class CustomDrawableView extends View {

    Paint paint = new Paint();

    public CustomDrawableView(Context context) {

      super(context);

      paint.setColor(0xff00ff00);

      paint.setStyle(Style.STROKE);

      paint.setStrokeWidth(2);

      paint.setAntiAlias(true);

    };

 

    protected void onDraw(Canvas canvas) {

      int width = getWidth();

      int height = getHeight();

      int centerx = width/2;

      int centery = height/2;

      canvas.drawLine(centerx, 0, centerx, height, paint);

      canvas.drawLine(0, centery, width, centery, paint);

      // Rotate the canvas with the azimut     

      if (azimut != null)

        canvas.rotate(-azimut*360/(2*3.14159f), centerx, centery);

      paint.setColor(0xff0000ff);

      canvas.drawLine(centerx, -1000, centerx, +1000, paint);

      canvas.drawLine(-1000, centery, 1000, centery, paint);

      canvas.drawText("N", centerx+5, centery-10, paint);

      canvas.drawText("S", centerx-10, centery+15, paint);

      paint.setColor(0xff00ff00);

    }

  }

 

  CustomDrawableView mCustomDrawableView;

  private SensorManager mSensorManager;

  Sensor accelerometer;

  Sensor magnetometer;

 

  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    mCustomDrawableView = new CustomDrawableView(this);

    setContentView(mCustomDrawableView);    // Register the sensor listeners

    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

      accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

  }

 

  protected void onResume() {

    super.onResume();

    mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);

    mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_UI);

  }

 

  protected void onPause() {

    super.onPause();

    mSensorManager.unregisterListener(this);

  }

 

  public void onAccuracyChanged(Sensor sensor, int accuracy) {  }

 

  float[] mGravity;

  float[] mGeomagnetic;

  public void onSensorChanged(SensorEvent event) {

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)

      mGravity = event.values;

    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)

      mGeomagnetic = event.values;

    if (mGravity != null && mGeomagnetic != null) {

      float R[] = new float[9];

      float I[] = new float[9];

      boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);

      if (success) {

        float orientation[] = new float[3];

        SensorManager.getOrientation(R, orientation);

        azimut = orientation[0]; // orientation contains: azimut, pitch and roll

      }

    }

    mCustomDrawableView.invalidate();

  }

}

 

 

 

 

 

 

 

출처 : http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

Config 파일을 수정하시면 해결되는데요, ddms.cfg 파일입니다.

 

저같은 경우에는 아래의 경로에 ddms.cfg 파일이 존재하였습니다.
( "ddms.cfg" 검색하니까 나오더라구요 )


C:\Users\Administrator\.android


ddms.cfg 파일을 메모장으로 열어서 adtUsed=true를 adtUsed=false 로 변경합니다.

 

 

 

 

이클립스를 다시 여시면 "Welcome to Android Development" 창이 뜨실겁니다.

 

 

 

 

 

 

+ Recent posts