Android 安卓加速计在z轴上读取0,无变化
我正在创建一个应用程序,利用加速计数据计算设备的滚动和俯仰。 这就是我现在所拥有的,仍然没有编码滚转/俯仰计算 只需检查存在哪些传感器并在logcat中列出它们,检查设备是否有加速计,并实现一个简单的输出GUI(4个文本视图,对应于3个轴和最大传感器范围) X和Y读数正确,手机静止,一次沿一个轴旋转,从0到9.5左右(对应于地球重力的正常9.8m/s2)。如预期的那样,晃动设备会导致值超过9.8阈值 然而,Z加速度(sensorEvent.values[2])在0.032左右是静止的(我们称之为零)。摇晃,旋转,除了把它扔到墙上以外的任何东西都不会产生任何变化。。。这使得我计算横滚和纵摇的任何尝试都毫无用处 这段代码有什么问题吗,或者我应该假设这部手机有什么问题(用我妻子的手机测试,手机型号完全相同:结果相同)Android 安卓加速计在z轴上读取0,无变化,android,accelerometer,android-sensors,Android,Accelerometer,Android Sensors,我正在创建一个应用程序,利用加速计数据计算设备的滚动和俯仰。 这就是我现在所拥有的,仍然没有编码滚转/俯仰计算 只需检查存在哪些传感器并在logcat中列出它们,检查设备是否有加速计,并实现一个简单的输出GUI(4个文本视图,对应于3个轴和最大传感器范围) X和Y读数正确,手机静止,一次沿一个轴旋转,从0到9.5左右(对应于地球重力的正常9.8m/s2)。如预期的那样,晃动设备会导致值超过9.8阈值 然而,Z加速度(sensorEvent.values[2])在0.032左右是静止的(我们称之为
- 加速计是KXTJ2-1009三轴加速计(适用于手机) 仅物理传感器)
- 手机是中国制造的HTM手机(假设是HTC的克隆)
()
公共类MainActivity扩展ActionBarActivity实现SensorEventListener{
private TextView raw_x, raw_y, raw_z, acc_max; private boolean hasAccelerometer; private SensorManager senSensorManager; private Sensor senAccelerometer; private long lastUpdate = 0; private float last_x, last_y, last_z; private static final int SHAKE_THRESHOLD = 700; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sMgr = (SensorManager) this.getSystemService(SENSOR_SERVICE); List<Sensor> list = sMgr.getSensorList(Sensor.TYPE_ALL); String data = new String(); for (Sensor sensor : list) { data += (sensor.getName() + "\n"); data += (sensor.getVendor() + "\n"); data += (sensor.getVersion() + "\n"); } Log.d(TAG, data); PackageManager manager = getPackageManager(); hasAccelerometer = manager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER); if(hasAccelerometer) { senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_NORMAL); } Log.d(TAG,Float.toString(senAccelerometer.getMaximumRange())); initGui(); } @Override protected void onResume() { super.onResume(); senSensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onSensorChanged(SensorEvent sensorEvent) { Sensor mySensor = sensorEvent.sensor; if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) { long curTime = System.currentTimeMillis(); float x = (float) sensorEvent.values[0]; float y = (float) sensorEvent.values[1]; float z = (float) sensorEvent.values[2]; if ((curTime - lastUpdate) > 100) { long diffTime = (curTime - lastUpdate); lastUpdate = curTime; float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000; if (speed > SHAKE_THRESHOLD) { //doSomething() } if(raw_x!=null){ raw_x.setText(Float.toString(x)); raw_y.setText(Float.toString(y)); raw_z.setText(Float.toString(z)); } last_x = x; last_y = y; last_z = z; } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } private void initGui() { setContentView(R.layout.activity_main); raw_x = (TextView) findViewById(R.id.lbl_raw_x); raw_y = (TextView) findViewById(R.id.lbl_raw_y); raw_z = (TextView) findViewById(R.id.lbl_raw_z); acc_max = (TextView) findViewById(R.id.lbl_max); acc_max.setText(Float.toString(senAccelerometer.getMaximumRange())); }
}private TextView raw_x、raw_y、raw_z、acc_max; 专用布尔加速度计; 私人传感器管理器传感器管理器; 专用传感器; private long lastUpdate=0; 私人浮动last_x,last_y,last_z; 私有静态最终int-SHAKE_阈值=700; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); sMgr=(传感器管理器)this.getSystemService(传感器服务); List List=sMgr.getSensorList(Sensor.TYPE\u ALL); 字符串数据=新字符串(); 用于(传感器:列表){ 数据+=(sensor.getName()+“\n”); 数据+=(sensor.getVendor()+“\n”); 数据+=(sensor.getVersion()+“\n”); } Log.d(标签、数据); PackageManager=getPackageManager(); HasAccelerator=manager.hasSystemFeature(PackageManager.FEATURE\u传感器\u加速计); 如果(加速度计){ senSensorManager=(SensorManager)getSystemService(Context.SENSOR\u SERVICE); SenAccelerator=senSensorManager.getDefaultSensor(传感器类型\加速计); senSensorManager.registerListener(此、senAccelerator、SensorManager.SENSOR\u延迟\u正常); } Log.d(TAG,Float.toString(senAccelerator.getMaximumRange()); initGui(); } @凌驾 受保护的void onResume(){ super.onResume(); senSensorManager.registerListener(此、senAccelerator、SensorManager.SENSOR\u延迟\u正常); } @凌驾 受保护的void onPause(){ super.onPause(); } @凌驾 公共空间{ super.ondestory(); } @凌驾 传感器更改时的公共无效(传感器事件传感器事件){ 传感器mySensor=sensorEvent.Sensor; if(mySensor.getType()==Sensor.TYPE\u加速计){ long curTime=System.currentTimeMillis(); float x=(float)sensorEvent.values[0]; float y=(float)sensorEvent.values[1]; float z=(float)sensorEvent.values[2]; 如果((curTime-lastUpdate)>100){ long diffTime=(curTime-lastUpdate); lastUpdate=curTime; 浮动速度=Math.abs(x+y+z-last_x-last_y-last_z)/diffTime*10000; 如果(速度>抖动阈值){ //doSomething() } 如果(原始x!=null){ 原始x.setText(Float.toString(x)); 原始设置文本(Float.toString(y)); 原始设置文本(Float.toString(z)); } 最后的x=x; 最后的y=y; last_z=z; } } } @凌驾 精度更改时的公共无效(传感器,int精度){ } 私有void initGui(){ setContentView(R.layout.activity_main); raw_x=(TextView)findViewById(R.id.lbl_raw_x); raw_y=(TextView)findViewById(R.id.lbl_raw_y); raw_z=(TextView)findViewById(R.id.lbl_raw_z); acc_max=(TextView)findViewById(R.id.lbl_max); acc_max.setText(Float.toString(senAccelerator.getMaximumRange()); }