检测android中的加速度计运动

检测android中的加速度计运动,android,Android,我正在开发一个应用程序,它需要检测加速计的运动,如震动或将手机向右、向左、向上和向下倾斜,基于这些运动,我将向我的UPnP设备发送一些键 例如,如果检测到右移动,请增加媒体服务器和viceversa的容量 请帮我做这个 我试过一些例子。它在左右两侧都能正常工作。但我需要一个更好的解决方案 我在这里添加代码 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); sensorManager.regi

我正在开发一个应用程序,它需要检测加速计的运动,如震动或将手机向右、向左、向上和向下倾斜,基于这些运动,我将向我的UPnP设备发送一些键

例如,如果检测到右移动,请增加媒体服务器和viceversa的容量

请帮我做这个

我试过一些例子。它在左右两侧都能正常工作。但我需要一个更好的解决方案

我在这里添加代码

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_NORMAL);
    lastUpdate = System.currentTimeMillis();


    @Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

        float[] values = event.values;

        // Movement
        float x = values[0];
        float y = values[1];
        float z = values[2];

        /*float accelationSquareRoot = (x * x + y * y + z * z)
                / (SensorManager.AXIS_X * SensorManager.AXIS_X);*/

        Log.d("Shakes","X: "+x+"  Y: "+y+"  Z: "+z);

        long actualTime = System.currentTimeMillis();
        if ((actualTime - lastUpdate) > 100) 
        {
            long diffTime = (actualTime - lastUpdate);
            lastUpdate = actualTime;


        if(Round(x,4)>8.0000){
            Log.d("sensor", "=====LEFT====");


        }
        else if(Round(x,4)<-8.0000){
            Log.d("sensor", "=====RIGHT====");

        }
        else if(Round(z,4) < -0.0){
           Log.d("sensor", "=====UP====");


        }

        else if(Round(y,4) < 1.0){
            Log.d("sensor", "=====DOWN====");

        }

        float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;

        if (speed > SHAKE_THRESHOLD) {
            //Log.d("sensor", "shake detected w/ speed: " + speed);
            //Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show();
        }
        last_x = x;
        last_y = y;
        last_z = z;
        }
    }

}
sensorManager=(sensorManager)getSystemService(SENSOR\u SERVICE);
sensorManager.registerListener(此,
sensorManager.getDefaultSensor(传感器类型\加速计),
传感器管理器。传感器延迟(正常);
lastUpdate=System.currentTimeMillis();
@凌驾
传感器更改时的公共无效(传感器事件){
if(event.sensor.getType()==sensor.TYPE\u加速计){
float[]值=event.values;
//运动
浮点x=值[0];
浮动y=值[1];
浮动z=数值[2];
/*浮动加速度平方根=(x*x+y*y+z*z)
/(SensorManager.AXIS_X*SensorManager.AXIS_X)*/
对数d(“摇晃”,“X:+X+”Y:+Y+”Z:+Z);
长实际时间=System.currentTimeMillis();
如果((实际时间-上次更新)>100)
{
long diffTime=(实际时间-上次更新);
lastUpdate=实际时间;
如果(圆形(x,4)>8.0000){
Log.d(“传感器”,“左==”);
}
else if(四舍五入(x,4)抖动_阈值){
//日志d(“传感器”,“检测到震动,速度:”+速度);
//Toast.makeText(这是“检测到的震动w/speed:+速度,Toast.LENGTH_SHORT.show”);
}
最后的x=x;
最后的y=y;
last_z=z;
}
}
}

X轴水平并指向右侧,Y轴垂直并指向上方,Z轴指向屏幕正面的外侧。在该系统中,屏幕后面的坐标具有负Z值

更多细节

在你的情况下,试试这个

        if(Round(x,4)>8.0000){
            Log.d("sensor", "=====LEFT====");


        }
        else if(Round(x,4)<-8.0000){
            Log.d("sensor", "=====RIGHT====");

        }
        else if(Round(y,4) < 8.0){
           Log.d("sensor", "=====UP====");


        }

        else if(Round(y,4) < -8.0){
            Log.d("sensor", "=====DOWN====");

        }
if(圆形(x,4)>8.0000){
Log.d(“传感器”,“左==”);
}
else if(第(x,4)轮
if(第(x,4)轮>8.0000){
Log.d(“传感器”,“左==”);
}
else if(圆形(x,4)9&&z<10)
Log.d(“传感器”,“向下==”);
否则如果(z>-10&&z<-9)
Log.d(“传感器”,“向上==”);

hi CapDroid,谢谢你的建议,我试过了,但它会影响用户阈值。我的意思是说用户应该始终以垂直方式握住手机。如果我使用y值,并且如果我以正常可读的方式握住手机,它将始终向上发送运动键。我尝试使用一些准确的值,这些值不会影响e用户恢复手机的正常方式。我正在尝试y和z的组合。仍然没有找到任何好的结果。你能解决你的问题吗??
if(Round(x,4)>8.0000){
            Log.d("sensor", "=====LEFT====");


        }
        else if(Round(x,4)<-8.0000){
            Log.d("sensor", "=====RIGHT====");

        }
        else if (z >9 && z < 10)
            Log.d("sensor", "=====DOWN====");

        else if (z > -10 && z < -9)
             Log.d("sensor", "=====UP====");