为什么sensorManager.registerListener无法为步骤计数器注册侦听器?

问题描述

我想找出未为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","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>

它显示带有Toast的{​​{1}}和NOT registered中的错误

Logcat

P.S。它弹出E/SensorManager: registerListenerImpl sensorName:Step Counter,isWakeUpSensor:false 吐司,以检查该传感器的存在。还有其他必须添加到清单中的东西吗?也许这是注册侦听器的错误方法?

解决方法

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...