Android 10 无法注册 Sensor.TYPE_STEP_COUNTER

Thi*_*gen 8 android android-sensors

我目前正在开发一个应用程序来跟踪步骤。

为了跟踪步骤,我使用手机的以下传感器:Sensor.TYPE_STEP_COUNTER

这适用于我测试过的所有设备。最近我有机会在三星 S10 设备上测试该应用程序,但它不再跟踪步骤,而它可以在三星 S9 的 Android 9 上运行。它也适用于运行 Android 6 的 Google Nexus。

现在出现的问题是这是否与我的代码有关,还是 Android 10 的问题?

我在运行应用程序时发现以下警告:

  • 2020-01-06 17:13:30.381 24261-24261/? D/SensorManager: registerListener fail (1) :: 17, SAMSUNG Step Counter Sensor, 200000, 0,

一些额外的调试信息:

  • Sensor name="SAMSUNG Step Detector Sensor", vendor="Samsung Inc.", version=1, type=18, maxRange=1.0, resolution=1.0, power=0.3, minDelay=0

调试信息有些混杂,因为我测试了计步器传感器和计步器传感器都产生了相同的结果。

我注册传感器的代码:

 private SensorEventListener sensorEventListener = new SensorEventListener() {
    /**
     * This Method gets called on each Sensor Trigger event
     *
     * @param sensorEvent Event created by Sensor
     */
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        //ME COUNTING STEPS
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
        //Nothing to do here
    }
};

private SensorManager sensorManager;

/**
 * Function that initialises all the Sensors
 * Sets SensorManager
 * Sets Sensor to monitor to STEP Counter
 * Also Registers the Sensor
 */
private void initSensors() {
    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    assert sensorManager != null;
    Sensor stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);

    if (stepSensor == null) {
        createToastMessage("Sensor not found.");
        selectedFragment = new NoSensor_Fragment();
        activeFragment = 5;
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                selectedFragment).commit();
    } else {
        sensorManager.registerListener(sensorEventListener, stepSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
        hasSensor = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我找到了解决此问题的方法

就我而言,这是权限的简单错误。在 Android 10 上,您需要请求权限才能访问步进传感器。在阅读 Android 10 的更改时,我忽略了这一点。我在Manifest.xml 中添加了以下内容

    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
Run Code Online (Sandbox Code Playgroud)

并在onCreate方法中添加以下内容:

if(ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_DENIED){
        //ask for permission
        requestPermissions(new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, PHYISCAL_ACTIVITY);
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助与我面临同样问题的人。

Thi*_*gen 12

可能的解决方案

就我而言,这是权限的简单错误。在 Android 10 上,您需要请求权限才能访问步进传感器。在阅读 Android 10 的更改时,我忽略了这一点。我在Manifest.xml 中添加了以下内容

    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
Run Code Online (Sandbox Code Playgroud)

并在onCreate方法中添加以下内容:

if(ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_DENIED){
        //ask for permission
        requestPermissions(new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, PHYISCAL_ACTIVITY);
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助与我面临同样问题的人。