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

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

Видео-урок:

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

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

1. Запускаем Android Studio и выбираем «Start a new Android Studio project»:
Android Studio: Создание простого шагомера (Step Counter)
2. На окне диалога выбора шаблона проекта «Select a Project Template«, выбираем «Empty Activity» и нажимаем кнопку «Next»:
Android Studio: Создание простого шагомера (Step Counter)
3. На экране конфигурации проекта заполняем нужные поля и жмём «Finish»:
Android Studio: Создание простого шагомера (Step Counter)

Дизайн и код

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

4. На пустом поле окна Дизайнера нажимаем правую кнопку мыши и выбираем «Convert View…»:
Android Studio: Создание простого шагомера (Step Counter)
5. Появится диалоговое окно, где нужно будет выбрать и подтвердить смену View на LinearLayout (это автоматически сменит код в файле activity_main.xml на нужный нам):
Android Studio: Создание простого шагомера (Step Counter)
6. Аналогичным образом поменяем ориентацию LinearLayout на Вертикальную:
Android Studio: Создание простого шагомера (Step Counter)
При этом в xml-код будет добавлена строка:

    android:orientation="vertical"

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

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

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

 

8. В окне Дизайнера удалим старый TextView и перетащим два новых:
Android Studio: Создание простого шагомера (Step Counter)
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 и выше) отдельная заметка.

 



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

      1. Фото аватараДарья

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

          1. Фото аватараДарья

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

          2. Фото аватараDenTNT Автор записи

            Спасибо, что написали. Посмотрю, что можно сделать, чтобы исправить эти ошибки.
            Проще переделать сразу на Kotlin. Нужно несколько дней…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *