首页 > 解决方案 > 为什么 sensorManager.registerListener 无法为 Step Counter 注册监听器?

问题描述

我想弄清楚没有为step counter传感器注册监听器的原因以及如何克服它。

MainActivity.java

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager sensorManager;
    private TextView count;
    boolean activityRunning;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        count = (TextView) findViewById(R.id.counter);

        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    }

    @Override
    protected void onResume() {
        super.onResume();
        activityRunning = true;
        Sensor countSensor = sensorManager
                .getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
        if (countSensor != null) {
            if (sensorManager.registerListener(this, countSensor, SensorManager.SENSOR_DELAY_UI)) {
                Toast.makeText(this, "registered", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "NOT registered", Toast.LENGTH_LONG).show();
            }
        } else {
            Toast.makeText(this, "Count sensor not available", Toast.LENGTH_LONG).show();
        }
        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_DETECTOR)) {
            Toast.makeText(getApplicationContext(), "STEP DETECTOR -> SUPPORTED", Toast.LENGTH_LONG).show();
            Log.i("onResume", "step detector is supported");
        } else {
            Toast toast = Toast.makeText(getApplicationContext(), "STEP DETECTOR -> NO", Toast.LENGTH_LONG).show();
            Log.i("onResume", "step detector is NOT supported");
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        activityRunning = false;
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (activityRunning) {
            count.setText(String.valueOf(event.values[0]));
            Toast.makeText(this, "onSensorChanged", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "changed, else branch", Toast.LENGTH_LONG).show();
        }
    }

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

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    <uses-feature android:name="android.hardware.sensor.stepcounter" android:required="true"/>
    <uses-feature android:name="android.hardware.SensorManager"/>
    <uses-feature android:name="android.hardware.Sensor"/>
    <uses-feature android:name="android.hardware.SensorEvent"/>
    <uses-feature android:name="android.hardware.SensorEventListener"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

它显示了一个ToastwithNOT registered和这个错误Logcat

E/SensorManager: registerListenerImpl sensorName:Step Counter,isWakeUpSensor:false

PS 它会弹出STEP DETECTOR -> SUPPORTEDtoast 以检查此传感器的存在。还有其他必须添加到清单的内容吗?或者可能,这是注册听众的错误方式?

标签: javaandroid

解决方案


尝试将活动识别权限添加到您的清单:

<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>

如果您的应用面向 Android 10+(API 29 或更高版本),您可能还需要在运行时请求权限: https ://developer.android.com/about/versions/10/privacy/changes#physical-activity-认出


推荐阅读