android – 是否可以测量手机垂直移动的距离

android – 是否可以测量手机垂直移动的距离,第1张

概述我只是想知道是否可能/我将在哪里开始测量 Android设备的向上和向下移动.我需要它尽可能准确. 我很遗憾在哪里看到我已经看到有某些方法here,并且看着these old questions他们提到它很难但我想知道从那以后在新版本的android中是否有任何改进. 下面的图片是我希望手机移动方向的一个额外示例. 在进行解决方案之前,我会将解决方案拆分为小资产并将解决方案放在一起 >我们需要听手 我只是想知道是否可能/我将在哪里开始测量 Android设备的向上和向下移动.我需要它尽可能准确.

我很遗憾在哪里看到我已经看到有某些方法here,并且看着these old questions他们提到它很难但我想知道从那以后在新版本的androID中是否有任何改进.

下面的图片是我希望手机移动方向的一个额外示例.

解决方法 在进行解决方案之前,我会将解决方案拆分为小资产并将解决方案放在一起

>我们需要听手机传感器
>我们需要检查手机是否处于垂直位置
>我们需要制作一个时间计数器,用于垂直注册手机并计数
>我们需要在屏幕上显示时间

对于第一步,我将向我们的类实现SensorEventListener,这将允许我们使用onSensorChanged方法.

@OverrIDepublic voID onSensorChanged(SensorEvent event) {    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {        ListenToSensors(event);    }}private voID ListenToSensors(SensorEvent event) {    if (isPhoneVertical(event)) {        timeCounter();        if (mStatus) {            mStartTime = getStartTime();            mStatus = false;        }    } else {        if (!mStatus) {            mTotalTime = getDiffTime() + mTotalTime;            mStatus = true;        }    }}

对于第二步,我构建了一个名为isPhoneVertical的方法来检查我们的手机是否处于垂直方向,它主要是检查y轴.您可以通过更改maxVertical来更改陡度.
她的价值不那么陡,0意味着手机应该几乎100%垂直.对于我的测试,它设置为3.

private boolean isPhoneVertical(SensorEvent event) {    float[] values = event.values;    double y = values[1];    // do not change this value    double yAxisInitValue = 10.0;    double vermargin = yAxisInitValue - maxVertical;    return y >= vermargin;}

对于第3步,我做了一些方法来检查开始时间和停止时间,并更新一个跟踪时间的全局变量,以秒为单位.

private long getStartTime() {    return System.currentTimeMillis() / 1000;}private long getDiffTime() {    return getStartTime() - mStartTime;}

对于第4步,我已经定期运行RunUnThread来更新屏幕上的时间.

private voID timeCounter() {    runOnUiThread(new Runnable() {        @OverrIDe        public voID run() {            mVIEw1.setText("Phone has been vertical for: " + getDiffTime() + " seconds");            mVIEw2.setText("The total time: " + (mTotalTime + getDiffTime()) + "");        }    });}

也就是说这个解决方案是为了说明如何达到这个目标,我相信它可以通过不同的方式完成.但我想展示解决方案背后的逻辑.

这里是应用程序的屏幕截图,它计算每次手机垂直的时间和垂直的总时间.

解决方案包括一些解释:

MainActivity.java

public class MainActivity extends Activity implements SensorEventListener {    private SensorManager mSensorManager;    private Sensor mAccelerometer;    private TextVIEw mVIEw1,mVIEw2;    private long mStartTime;    private long mTotalTime;    private boolean mStatus = true;    // less value her less steep,0 means the phone should almost be 100% vertical    // try it out    private double maxVertical = 3.0;    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        requestwindowFeature(Window.FEATURE_NO_Title);        getwindow().setFlags(WindowManager.LayoutParams.FLAG_FulLSCREEN,WindowManager.LayoutParams.FLAG_FulLSCREEN);        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        mVIEw1 = (TextVIEw) findVIEwByID(R.ID.textVIEw1);        mVIEw2 = (TextVIEw) findVIEwByID(R.ID.textVIEw2);        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);    }    @OverrIDe    public voID onSensorChanged(SensorEvent event) {        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {            ListenToSensors(event);        }    }    private voID ListenToSensors(SensorEvent event) {        if (isPhoneVertical(event)) {            timeCounter();            if (mStatus) {                mStartTime = getStartTime();                mStatus = false;            }        } else {            if (!mStatus) {                mTotalTime = getDiffTime() + mTotalTime;                mStatus = true;            }        }    }    // This method return true only for specific phone orIEntation    // y axis for vertical orIEntation    private boolean isPhoneVertical(SensorEvent event) {        float[] values = event.values;        double y = values[1];        // do not change this value        double yAxisInitValue = 10.0;        double vermargin = yAxisInitValue - maxVertical;        return y >= vermargin;    }    private long getStartTime() {        return System.currentTimeMillis() / 1000;    }    private long getDiffTime() {        return getStartTime() - mStartTime;    }    // update steps in user interface    private voID timeCounter() {        runOnUiThread(new Runnable() {            @OverrIDe            public voID run() {                mVIEw1.setText("Phone has been vertical for: " + getDiffTime() + " seconds");                mVIEw2.setText("The total time: " + (mTotalTime + getDiffTime()) + "");            }        });    }    @OverrIDe    public voID onAccuracyChanged(Sensor sensor,int accuracy) {    }    @OverrIDe    protected voID onResume() {        super.onResume();        mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_norMAL);    }    @OverrIDe    protected voID onPause() {        super.onPause();        // if you want to collect data while mobile screen off,just disable the        // following line,the app will still collecting sensor data        mSensorManager.unregisterListener(this);    }}

activity_main.xml中

<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:tools="http://schemas.androID.com/tools"    androID:ID="@+ID/activity_main"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:paddingBottom="@dimen/activity_vertical_margin"    androID:paddingleft="@dimen/activity_horizontal_margin"    androID:paddingRight="@dimen/activity_horizontal_margin"    androID:paddingtop="@dimen/activity_vertical_margin"    tools:context="com.example.maytham.verticaltravels.MainActivity">    <TextVIEw        androID:ID="@+ID/textVIEw1"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_alignParentleft="true"        androID:layout_alignParentStart="true"        androID:layout_alignParenttop="true"        androID:textSize="20sp"        androID:text="TextVIEw1" />    <TextVIEw        androID:ID="@+ID/textVIEw2"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:layout_alignParentleft="true"        androID:layout_alignParentStart="true"        androID:layout_below="@+ID/textVIEw1"        androID:layout_margintop="57dp"        androID:textSize="20sp"        androID:text="TextVIEw2" /></relativeLayout>

我也会留下一些阅读链接.

> https://developer.android.com/reference/android/hardware/SensorManager.html
> http://www.livescience.com/40103-accelerometer-vs-gyroscope.html
> https://physics.stackexchange.com/questions/41653/how-do-i-get-the-total-acceleration-from-3-axes
> https://code.tutsplus.com/tutorials/how-to-recognize-user-activity-with-activity-recognition–cms-25851
> http://www.vogella.com/tutorials/AndroidSensor/article.html
> How to get Android phone orientation matching human orientation?

如果您认为我可能会添加更多可以帮助您解决问题的信息,请告诉我们.目前还不清楚你是否正在寻找行走检测/计数器,如果这是你感兴趣的一些事情,请看下面的答案/链接.

> Activity Recognition Api
> How to detect walking with Android accelerometer
> how to calculate exact foot step count using accelerometer in android?
> Detect Movement Accurately using Accelerometer in Android

和GitHub源代码

> https://github.com/bagilevi/android-pedometer
> https://github.com/tartakynov/robowalk

总结

以上是内存溢出为你收集整理的android – 是否可以测量手机垂直移动的距离全部内容,希望文章能够帮你解决android – 是否可以测量手机垂直移动的距离所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1136390.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存