📜  只有全屏不透明活动才能请求方向 (1)

📅  最后修改于: 2023-12-03 14:50:37.397000             🧑  作者: Mango

只有全屏不透明活动才能请求方向

Android 应用程序需要知道设备的方向来自适应地呈现 Q 图形。 为了请求设备的方向,我们通常使用方向传感器、加速度计、磁力计等硬件设备。但在 Android 5.0 及更高版本中(API 级别21),你需要在全屏幕幕识别区域内才能够使用这些硬件设备。

全屏不透明活动

全屏幕幕识别区域是指没有任何透明度、半透明度或者其他不透明的部分占据屏幕的状态。 当前应用程序不再拥有展示状态栏或导航栏的权限,除非你使用 SYSTEM_UI_FLAG_LAYOUT_STABLE 标志。

因此,在 Android 5.0及以上版本中,只有全屏幕活动才能够使用方向传感器、加速度计、磁力计等硬件设备。

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager mSensorManager;
    private Sensor mRotationSensor;

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

        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mRotationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);

        if (mRotationSensor == null) {
            Log.w(TAG, "Rotation vector sensor not available");
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mRotationSensor != null) {
            mSensorManager.registerListener(this, mRotationSensor, SensorManager.SENSOR_DELAY_UI);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mRotationSensor != null) {
            mSensorManager.unregisterListener(this, mRotationSensor);
        }
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        float[] rotationMatrix = new float[16];
        SensorManager.getRotationMatrixFromVector(rotationMatrix, sensorEvent.values);
        float[] orientation = new float[3];
        SensorManager.getOrientation(rotationMatrix, orientation);
        // handle orientation here
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
        // do nothing
    }
}
总结

在 Android 5.0及以上版本中,只有清晰地设置全屏幕幕识别区域的 Activity 才能够使用方向传感器、加速度计、磁力计等硬件设备。如果你使用这些硬件设备,你需要确保你的应用程序支持全屏幕幕识别区域,并正确地使用各种传感器。