Android Studio: Создание простого шагомера (Step Counter)

Я пока не могу заставить работать датчики в Unity New Input System, поэтому решил освоить плагины — попробую через них достучаться до сенсоров таким образом.
Чтобы лучше в этом разобраться, я начал с изучения создания приложения простенького шагомера на Андроид.

Видео-урок:

Для работы нам потребуется Android Studio

Подготовка проекта

1. Запускаем Android Studio и выбираем «Start a new Android Studio project»:

2. На окне диалога выбора шаблона проекта «Select a Project Template«, выбираем «Empty Activity» и нажимаем кнопку «Next»:

3. На экране конфигурации проекта заполняем нужные поля и жмём «Finish»:

Дизайн и код

По умолчанию в окошке Дизайна нам сразу предлагается контейнер ViewGroup, с типом ConstraintLayout. Поскольку для размещения элементов в этом случае используется привязка, то это нам будет не так удобно. Поменяем тип на LinearLayout. Для смены контейнера можно исправить код в файле activity_main.xml, но в моём случае быстрее будет сделать это прямо в окне Дизайнера.

4. На пустом поле окна Дизайнера нажимаем правую кнопку мыши и выбираем «Convert View…»:

5. Появится диалоговое окно, где нужно будет выбрать и подтвердить смену View на LinearLayout (это автоматически сменит код в файле activity_main.xml на нужный нам):

6. Аналогичным образом поменяем ориентацию LinearLayout на Вертикальную:

При этом в xml-код будет добавлена строка:

    android:orientation="vertical"

Вообще рекомендуется использовать ConstraintLayout для лучшей производительности и совместимости. Но в этом примере я применю LinearLayout.

7. Чтобы текст был выровнен по вертикали по центру я внесу изменения в XML:

android:gravity="center"
В Дизайнере можно сделать то же самое, если в окошке Attributes (кнопка в правом верхнем углу окошка Дизайнера) для объекта Layout выставить соответствующее выравнивание:

 

8. В окне Дизайнера удалим старый TextView и перетащим два новых:

9. В коде исправим для них id на новые значения:

activity_main.xml
android:id="@+id/textView_Info"
android:id="@+id/textView_Steps"

10. Изменим текст, размер и его положение, т.о. окончательный код activity_main.xml будет таким:

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView_Info"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Steps" />

    <TextView
        android:id="@+id/textView_Steps"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />
</LinearLayout>

11. Теперь нам нужно дописать несколько строк в файл MainActivity.java:

MainActivity.java
package com.example.simplestepscounter;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements SensorEventListener
{
  SensorManager sensorManager;
  TextView tv_Steps;

  boolean isRunning = false;

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    tv_Steps = (TextView) findViewById(R.id.textView_Steps);
  }

  @Override
  protected void onResume()
  {
    super.onResume();
    isRunning = true;
    Sensor countSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
    if (countSensor != null)
    {
      sensorManager.registerListener(this, countSensor, SensorManager.SENSOR_DELAY_UI);
    }
    else
    {
      Toast.makeText(this, "STEP_COUNTER sensor not found", Toast.LENGTH_SHORT).show();
    }
  }

  @Override
  protected void onPause()
  {
    super.onPause();
    isRunning = false;
//    sensorManager.unregisterListener(this); // this will stop detecting steps!
  }

  @Override
  public void onSensorChanged(SensorEvent event)
  {
    if (isRunning)
    {
      tv_Steps.setText(String.valueOf(event.values[0]));
    }
  }

  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy)
  {
    // Needed this method to skip the error
    // error: MainActivity is not abstract and does not override abstract method onAccuracyChanged(Sensor,int) in SensorEventListener
    // public class MainActivity extends AppCompatActivity implements SensorEventListener
  }
}

Ошибки

Проверил на новом телефоне — и правда, как пишут в комментариях, не работает — не обновляется. Посмотрел Logcat, там были ошибки:

Unknown bits set in runtime_flags: 0x8000
AtomicFileUtils: readFileLines file not exist: android.util.AtomicFile@c439f5b
AtomicFileUtils: readFileLines file not exist: android.util.AtomicFile@70b30d1

 

Кроме этого в окошке запуска (Run) была такая ошибка:

E/: APS:IFLoad:importExternalFunctions, search function createNewHwApsUtils failed, dlsym err:undefined symbol: createNewHwApsUtils

 

У меня на этом телефоне Андроид 10. Раньше я проверял на другом, там была вроде 7.
Для старших версий Андроид нужны разрешения на доступ к датчикам. Попробую добавить разрешения…
Добавим строчку в файл AndroidManifest.xml:

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

Но это мне не помогло. Завтра может ещё поищу решение.

Для новых версий Андроид (API level 29 и выше) отдельная заметка.

 

3 2 votes
Article Rating
Подписаться
Уведомление о
guest
6 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
alev

не считает(

Дарья

У меня тоже не работает, все полностью копировала, ничего не меняла

Дарья

На андроид 11 тоже не работает? Я отладку делаю на смартфоне и у меня 11