Android バックグラウンドで位置情報が取れない場合に、バッテリーセーブの状態を調べる 

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


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です