0

TYPE_STEP_COUNTERを使用すると、歩数計(歩数計)がないように見えるSamsung電話があります。オンラインで検索した後、加速度計センサーを使用した実装に出くわしました。しかし、問題は、ステップの検出において実装があまり正確ではないことです。数値を調整しようとしましたが、まだあまり信頼できません。x、y、z 軸の 2 乗を加算し、ルートを計算してステップの大きさを取得します。だから私の質問は、誰かがこれを行ったことがありますか、そして彼らがどのようにそれを行ったのかということです。ありがとう、これが私が使用しているコードです

public class StatsFragment extends Fragment implements SensorEventListener {
    private static final String LOG_TAG = "STATS";
    private TextView stepCountTextView;
    private Button clearCounterButton;
    private Sensor stepSensor;
    private Integer stepCount = 0;
    private double MagnitudePrevious = 0;
    private SensorManager sensorManager;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_stats, container, false);

        stepCountTextView = view.findViewById(R.id.step_counter);
        clearCounterButton = view.findViewById(R.id.clear_button);

        sensorManager = (SensorManager) getActivity().getSystemService(getActivity().SENSOR_SERVICE);
        stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        clearCounterButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                stepCount = 0;
                stepCountTextView.setText(stepCount.toString());
            }
        });

        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        if(stepSensor != null) {
            sensorManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_UI);
        }
        else {
            Toast.makeText(getActivity(), "Sensor not available!", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        //unregister sensor
        sensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        if (sensorEvent != null) {
            float x_acceleration = sensorEvent.values[0];
            float y_acceleration = sensorEvent.values[1];
            float z_acceleration = sensorEvent.values[2];
            double Magnitude = Math.sqrt(x_acceleration*x_acceleration + y_acceleration*y_acceleration
                    + z_acceleration*z_acceleration);
            double MagnitudeDelta = Magnitude - MagnitudePrevious;
            MagnitudePrevious = Magnitude;

            if (sensorEvent.values[0] > 6){
                stepCount++;
            }
            stepCountTextView.setText(stepCount.toString());
        }
    }

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

    }
}
4

1 に答える 1

0

Android 10 では、ステップ センサーにアクセスするためのアクセス許可を要求する必要があります。以下の add コードをManifest.xmlに追加します。

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

onCreateViewメソッドに次のコードを追加します。

if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION) == PackageManager.PERMISSION_DENIED){
   //ask for permission
   requestPermissions(new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, 0);
 }
于 2020-09-26T11:56:37.287 に答える