如何在安卓系统中检测翻转动作?

5
如果用户翻转手机,我希望能够停止文本朗读功能。这对我的应用程序来说是一个不错的功能,但是我该如何检测到这种动作呢?我并不熟悉运动传感器,并且我无法找到特定的运动监听器,大多数都是屏幕旋转。谢谢帮助!

只是一个想法:如果“把手机面朝下”可以(而不仅仅是在空中翻转),那么检测环境光突然变暗可能会起作用(参见此处)。不知道是否有相应的监听器。 - TripeHound
我会在周一稍后查看,看看能否使用它。根据文档,环境传感器更容易使用,所以我很有希望 :) - Zoltán Umlauf
1个回答

1
这个示例展示了如何使用设备的重力传感器来检测设备是否被翻转。在方法onSensorChanged()中,术语factor确定了“翻转”必须有多完整。典型范围可能是0.7到0.95。
支持重力传感器是在Android API 9中添加的。并不是所有设备都有重力传感器。
public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private static final String TAG = "Demo";

    private SensorManager mSensorManager;
    private Sensor mGravitySensor;
    private boolean mFacingDown;

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // nothing
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        final float factor = 0.95F;

        if (event.sensor == mGravitySensor) {
            boolean nowDown = event.values[2] < -SensorManager.GRAVITY_EARTH * factor;
            if (nowDown != mFacingDown) {
                if (nowDown) {
                    Log.i(TAG, "DOWN");
                } else {
                    Log.i(TAG, "UP");
                }
                mFacingDown = nowDown;
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mGravitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);

        if (mGravitySensor == null) {
            Log.w(TAG, "Device has no gravity sensor");
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mGravitySensor != null) {
            mSensorManager.registerListener(this, mGravitySensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
    }
}

谢谢!我会在周一回到学校后去尝试它,因为我正在那里以作业的形式开发我的应用。(不会忘记接受它的 :)) - Zoltán Umlauf
实际上应用程序无法启动是由于完全不同的原因,我只需要从手机中删除它并重新安装即可。 - Zoltán Umlauf
当我在一个活动中尝试使用我的GravitySensor类时,在Android Studio的“Run”选项卡上出现以下错误: pkg: /data/local/tmp/com.example.uzoltan.readout Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE] - Zoltán Umlauf
现在我已经在7个活动中实现了它,可能会保持这种方式。 - Zoltán Umlauf
1
@Zoltán 传感器更新是异步的,不会阻塞主线程。我想不出你需要使用AsyncTask的原因。你可以为传感器处理创建一个类。该类将需要方法来注册和注销监听器。当活动暂停或停止时,必须注销监听器,否则您将继续收到更新(大约每秒5次)。还要注意,有些翻转手机的动作也会导致配置更改(屏幕旋转)。在这些情况下,您的活动将被停止、销毁并重新创建。 - Bob Snyder
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接