Android 重力感应手机方向

jopen 11年前

    package net.canking.turnmute;                import java.util.List;                import net.canking.manager.AudioM;        import net.canking.turnmute.R.string;        import android.hardware.Sensor;        import android.hardware.SensorEvent;        import android.hardware.SensorEventListener;        import android.hardware.SensorManager;        import android.media.AudioManager;        import android.os.Bundle;        import android.provider.ContactsContract.CommonDataKinds.Event;        import android.app.Activity;        import android.content.Context;        import android.view.Menu;        import android.view.MenuItem;        import android.view.View;        import android.widget.Button;        import android.widget.TextView;        import android.support.v4.app.NavUtils;                public class MainActivity extends Activity {            private SensorManager mSensorManager;            private Button buttonOpen, buttonClose;            private TextView tView;            private String modeStr;            private AudioM audioM;            private Sensor sensor;            private  final SensorEventListener mSensorEventListener =                 new SensorEventListener() {                                public void onSensorChanged(SensorEvent event) {                    // TODO Auto-generated method stub                    if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){                        float fPitchAngle = event.values[SensorManager.DATA_Y];                        if(fPitchAngle<-120){                            audioM.setMode(AudioManager.RINGER_MODE_SILENT);                            tView.setText(getString(R.string.tip)+"静音");                        }else {                            audioM.setMode(AudioManager.RINGER_MODE_NORMAL);                            tView.setText(getString(R.string.tip)+"普通");                        }                    }                }                                public void onAccuracyChanged(Sensor sensor, int accuracy) {                    // TODO Auto-generated method stub                                    }            };                                             @Override            public void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                getView();                mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);                audioM = new AudioM(MainActivity.this);                modeStr = audioM.getAudioManagetMode();                sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);                addListener();            }                        private void  getView() {                buttonOpen = (Button)findViewById(R.id.open);                buttonClose = (Button)findViewById(R.id.close);                tView = (TextView)findViewById(R.id.textView1);                            }                        private void addListener(){                /*mSensorEventListener =                     new SensorEventListener() {                                                public void onSensorChanged(SensorEvent event) {                            // TODO Auto-generated method stub                            if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){                                float fPitchAngle = event.values[SensorManager.DATA_Y];                                if(fPitchAngle<-120){                                    audioM.setMode(AudioManager.RINGER_MODE_SILENT);                                    tView.setText(getString(R.string.tip)+"静音");                                }else {                                    audioM.setMode(AudioManager.RINGER_MODE_NORMAL);                                    tView.setText(getString(R.string.tip)+"普通");                                }                            }                        }                                                public void onAccuracyChanged(Sensor sensor, int accuracy) {                            // TODO Auto-generated method stub                                                    }                    };*/                buttonOpen.setOnClickListener(new Button.OnClickListener() {                                        public void onClick(View v) {                        // TODO Auto-generated method stub                                                mSensorManager.registerListener(mSensorEventListener, sensor,                                SensorManager.SENSOR_DELAY_NORMAL);                    }                });                buttonClose.setOnClickListener(new Button.OnClickListener() {                                        public void onClick(View v) {                        // TODO Auto-generated method stub                        mSensorManager.unregisterListener(mSensorEventListener);                    }                });            }                    @Override            protected void onResume() {                // TODO Auto-generated method stub                super.onResume();                tView.setText(getString(R.string.tip)+modeStr);            }                    @Override            protected void onPause() {                // TODO Auto-generated method stub                super.onPause();                MainActivity.this.onDestroy();                MainActivity.this.finish();            }                }  

重力感应主要是依靠手机的加速度传感器(accelerometer)来实现        在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器。因为很多功能用户根本不care的所以可能开发商会把某些功能屏蔽掉。还是得根据真机的实际情况来做开发,今天我们主要来讨论加速度传感器的具体实现方式。

传感器名称如下:

加速度传感器(accelerometer)
陀螺仪传感器(gyroscope)
环境光照传感器(light)
磁力传感器(magnetic field)
方向传感器(orientation)
压力传感器(pressure)
距离传感器(proximity)
温度传感器(temperature)

 

1. 降噪处理,如果做过LBS软件的大家可能明白偏移修正,在GPS无法正常获取数据较间断时地图不能乱飘,这里Sensor也不例外,除了使用采样数据平均值获取外,可以间隔采样的方法来处理。细节的算法我们将在下节给出示例代码。

2. 感应器的敏感度,在Android中提供了四种延迟级别分别为

SENSOR_DELAY_FASTEST 最低延迟,一般不是特别敏感的处理不推荐使用,该种模式可能造成手机电力大量消耗,由于传递的为原始数据,算法不处理好将会影响游戏逻辑和UI的性能,所以Android开发网不推荐大家使用。

SENSOR_DELAY_GAME 游戏延迟,一般绝大多数的实时性较高的游戏都使用该级别。
int SENSOR_DELAY_NORMAL 标准延迟,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象。
int SENSOR_DELAY_UI 用户界面延迟,一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中我们不使用。
有关Android游戏开发中的Sensor感应示例今天我们将一起来讨论,对于目前最新的Android 2.2平台而言仍然没有具体的感应判断逻辑,下面我们一起定义下常用的感应动作事件。首先Android123提醒大家由于是三轴的立体空间感应所以相对于轨迹球、导航键的上下左右外,还提供了前后的感应,所以我们定义最基本的六种空间方向。

  1. public static final int CWJ_UP = 0;
  2. public static final int CWJ_DOWN = 1;
  3. public static final int CWJ_LEFT = 2;
  4. public static final int CWJ_RIGHT = 4;
  5. public static final int CWJ_FORWARD = 8; //向前
  6. public static final int CWJ_BACKWARD = 16; //向后

</div>

应用实例:已通过测试(只可以自己机器没感应)