Android

[안드로이드,Android] Sensor.TYPE_STEP_DETECTOR 가 포그라운드서비스에서 동작하지 않을 때 해결방법

만보기 앱의 기능을 보정하는 작업을 하고 있다. 특히 가속도계를 이용하여 걸음 수를 측정하기 위해 많은 테스트를 하였음에도 휴대폰 마다 가속도 센서(Sensor.TYPE_ACCELEROMETER)의 성능이 다르다는 것을 알게 되었고, 어떤 가속도 센서가 활성화 되면 굉장히 빠른 속도로 동작함을 알게되었다.

이런 가속도 센서를 이용한 스탭 기준을 측정하기 위한 임계값 설정이 필요한데 거의 마무리 단계인데
정확도면에서 Parcer 앱이나 LG 헬스 앱의 만보기의 걸음수 와 비교했을 때 걸음수가 부족하게 측정되지만

너무 과하게 측정되는 것보다는 운동차원에도 좋다고 생각하기에 임계값 기준과 걸음 수 측정기준 설정을 마무리 하였다.

Sensor.TYPE_STEP_DETECTOR, Sensor.TYPE_STEP_COUNTER 가 탑재되어 있는 스마트 폰들이 있다. 이런 스마트 폰의 경우 내장된 걸음 수 측정 값을 반환을 이용하여 걸음수를 측정하면 Parcer 앱이나 LG 헬스 앱과 동일한 걸음 수 측정값을 얻을 수 있음을 테스트해보고 알게 되었다.

그래서 만보기 앱에서 2개의 루틴으로 사용자에게 지원하기로 결정하고 Sensor.TYPE_STEP_DETECTOR를 사용한 만보기 걸음 수 측정 로직을 추가하였다.

Sensor.TYPE_STEP_DETECTOR, Sensor.TYPE_STEP_COUNTER 센서를 이용하기 위해서는 아래 퍼미션 관련하여 AndroidManifest.xml 파일에 추가해 주어야 한다.

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

먼저 스마트폰에 Sensor.TYPE_STEP_DETECTOR센서가 존재하는지 체크 후 존재하면 해당 센서를 이용하기 위해 신체활동 권한 허용을 요청하도록 다이얼로그 안내 팝업을 추가하였고 거부하는 경우 가속도센서를 이용한 기존 방식으로 걸음수를 측정하도록 구현하였다.

그런데 문제가 발생하였다. 가속도 센서를 이용한 걸음수 측정의 경우 포그라운드 서비스 혹은 백그라운드 서비스에 정상적으로 잘 동작하였다. 그러나 안드로이드 11 버전이 설치된 픽셀2 폰의 경우 휴대폰이 잠근화면이 되거나 꺼져 있는겨우 동작을 멈추었다. 로그를 찍어보았으나 백그라운드 서비스가 중지되거나 종료되는것은 아니였다.

원인해결을 위해 방법을 찾아 보던 중 다른 만보기 앱들은 어떻게 처리하는지 궁금하여 설치해보았다.

Parcer 앱이나 다른 만보기 앱의 경우 안드로이드 11버전에서 배터리 최적화 예외를 요청하는 권한을 요청하고 있었다. 그래서 나도 시도해보았다.

<AndroidManifest.xml>

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

<MainActivity.java>

private void callRunInBackgroudPermissionReqeust(){
	Log.d(AppSetting.TAG, "##  Build.VERSION.SDK_INT: " + String.valueOf(Build.VERSION.SDK_INT));
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
		String packageName = getPackageName();
		PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
		Log.d(AppSetting.TAG, "##  pm.isIgnoringBatteryOptimizations(packageName): " + pm.isIgnoringBatteryOptimizations(packageName));
		if (!pm.isIgnoringBatteryOptimizations(packageName)) {
			Intent intent = new Intent();
			intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
			intent.setData(Uri.parse("package:" + packageName));
			startActivityForResult(intent,777);
		}else {
			callMain();
		}

	}
}

.....

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
	super.onActivityResult(requestCode, resultCode, intent);

	if(resultCode == RESULT_OK){
		switch (requestCode){
			case 777:
				callMain();
				break;
		}
	}

}

배터리 최적화 예외 허용만 하면 정상적으로 동작되는것인가?

기대에 부풀어 빌드하여 테스트 해보았으나 여전히 동작하지 않는 것이다.

나랑 개발 방식이 다른것인가? 똑같이 포그라운서비스를 사용하고 있는데…..

혹시나 해서 안드로이드메니페스트파일에 uses-feature 속성으로 android.hardware.sensor.stepcoutner를 적용해보았다.

    <uses-feature
        android:name="android.hardware.sensor.stepcounter"
        android:required="true"/>

그러나 여전히 화면이 꺼지면 동작을 멈추었다. 내가 사용중인 센서는  Sensor.TYPE_STEP_DETECTOR 센서임으로 android.hardware.sensor.stepdetector를 적용해보았다.

    <uses-feature
        android:name="android.hardware.sensor.stepdetector"
        android:required="true"/>

화면이 꺼지면 여전히 동작하지 않는 것 같으면서도 동작을 하는 것 같기도 하고 애매하다. 걸음수가 턱없이 부족하기 때문이다. 방법이 없을까??

안드로이드 11버전이 설치된 구글 픽셀2폰에서 Pacer 만보기 앱은  Sensor.TYPE_STEP_DETECTOR 센서를 사용하여 동작하지 않음을 확인하였다.  pacer 만보기의 경우 안드로이 11버전 이상에서는 무조건 가속도 센서를 이용한 걸음수를 측정하는 것일까? 기준을 어떻게 잡았을까?  Sensor.TYPE_STEP_DETECTOR 동작하지 않음을 체크할 수 있는 방법이 있다면 분기를 하면 되는데………

pacer 만보기 역시  Sensor.TYPE_STEP_DETECTOR 를 이용해서 측정하는 걸음 수에 비해 정확도는 확실히 떨어졌다.

아래 스크린샷은 LG G7 폰에서 체크한 걸음 수이다.  Sensor.TYPE_STEP_DETECTOR 센서를 이용하고 있어서 정확도가 높다. 나의 만보기 앱과 LG헬스 앱의 만보기 걸음수가 거의 동일하다.


픽셀3a에서도 비슷한 문제가 있는 듯 하다.

Sensor.TYPE_STEP_COUNTER can not be gotten in Pixel 3a in Android 12 official version – ServeAnswer

android question: Sensor.TYPE_STEP_COUNTER can not be gotten in Pixel 3a in Android 12 official version

serveanswer.com

Sensor.TYPE_STEP_COUNTER는 휴대폰이 부팅 된 후 부터 총 걸음수를 리턴해준다.  이녀석은 백그라운드 혹은 포그라운서비스가 동작하지않고 있어도 여전히 걸음수를 세고 있을까? 만약 그렇다라고 한다면 실시간은 아니더라도 AlarmManger를 사용하여 15분 간격으로 UI에 걸음 수를 업데이트 처리해주거나 앱을 실행했을 때 업데이트 해주면 될 것 같다.

한가지 확실한 건 Sensor.TYPE_STEP_DETECTOR 센서는 화면이 꺼지면 동작하지 않는다.

한 번 시도해 보자!!

Leave a Reply

error: Content is protected !!