问题描述
我想找出未为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