Я пока не могу заставить работать датчики в 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"
8. В окне Дизайнера удалим старый TextView и перетащим два новых:
9. В коде исправим для них id на новые значения:
android:id="@+id/textView_Info"
android:id="@+id/textView_Steps"
10. Изменим текст, размер и его положение, т.о. окончательный код 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:
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, там были ошибки:
AtomicFileUtils: readFileLines file not exist: android.util.AtomicFile@c439f5b
AtomicFileUtils: readFileLines file not exist: android.util.AtomicFile@70b30d1
Кроме этого в окошке запуска (Run) была такая ошибка:
У меня на этом телефоне Андроид 10. Раньше я проверял на другом, там была вроде 7.
Для старших версий Андроид нужны разрешения на доступ к датчикам. Попробую добавить разрешения…
Добавим строчку в файл AndroidManifest.xml:
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION"/>
Но это мне не помогло. Завтра может ещё поищу решение.
- WordPress: Ошибка в плагине WpDiscuz - 08.10.2024
- Windows 10: Уменьшить размер виртуальной машины WSL - 06.10.2024
- Windows 10: Событие EventID 63 в Журнале Приложений - 28.09.2024