Androidで位置情報アプリを開発しておりますと、位置情報が取れないということにしばしば遭遇します。
ここでは、
・基本的なパーミッションの設定
・サービスで動作させる場合は、ForegroundServiceを使う
などの基本的なことはやっているのに、位置情報が取れないよ~ ぴえん という場合に、バッテリーセーブのことを調べると、役に立つ場合があるというのをご紹介します。
PowerManagerに
getLocationPowerSaveMode()
という関数があります。
https://developer.android.com/reference/android/os/PowerManager#getLocationPowerSaveMode()
次のように利用します。
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
int power_save_mode = powerManager.getLocationPowerSaveMode();
Log.d("sample", "Power Save Mode:" + power_save_mode);
}
すると、
2
とか
0
とかの数字が戻ってきます。
私の私物スマホはバッテリーセーブを基本的にONにしていると、2になっていて、2の意味は
LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF
All location providers should be disabled when battery saver is on and the device is non-interactive.
Constant Value: 2 (0x00000002)
です。位置情報のプロバイダは、バッテリーセーバーがONの場合とデバイスがインタラクティブではないときにオフられるようです。
0は
LOCATION_MODE_NO_CHANGE
Either the location providers shouldn't be affected by battery saver, or battery saver is off.
Constant Value: 0 (0x00000000)
だそうです。この場合は、バッテリーセーバーがONでもOFFでも位置情報プロバイダがオフられないようです。
詳しくは、下記のPowerManagerの定数一覧を見てみてください。
https://developer.android.com/reference/android/os/PowerManager#LOCATION_MODE_NO_CHANGE