Edited at

[PowerApps]バックグランドで緯度経度を取得する

これまで緯度経度を定期的に取得するときは、Location.LatitudeLocation.Longitudeをタイマーで取得していました。

しかし、画面を消したり他のアプリを立ち上げると緯度経度が取得できなくなる現象が発生し、常にPowerAppsをアクティブにする必要がありました。

この現象の理由を画面がアクティブになっていないとアプリが動かないためと思っていました。

でもそれは違いました。今回はそんなはお話です。


結論から

動かない理由はタイマーを使っているから

どうやらタイマーは画面を消したりアプリがアクティブになっていないと動いてくれないようです。


ということは

はい、タイマー以外なら動くようです。

すべてを確かめたわけではありませんが少なくともオーディオはバックグラウンドで動く機種がありました。

「動く機種があった」という表現は、もしかしたら機種によってバックグラウンドで動かない可能性も捨てきれないためです。


タイマーを使わないでどうやって緯度経度を取得する?

オーディオかスライダーを使います。

すでに @github129 さんが記事にしていますがスライダーを使ってタイマーより高速にループする実装をしています。

つまりスライダーはタイマーの代わりになるわけです。

実際、スライダーを使って定期的に緯度経度をFlowやPatchで送れることを確認しています。

ただし、他のアプリを起動しているケースには対応できそうなのですが、画面を消したときはなぜか送信が鈍化しました。

私が試した限りではオーディオの方が安定するようなので以降はオーディオでの実装方法を記述します。


用意するもの


  • オーディオ(Audio1)

  • Startボタン(btnStart)、Stopボタン(btnStop)

  • 送信した数を表示するラベル(lblCount) ※任意

image.png


スタートボタンとストップボタンで動かす

それぞれのボタンのOnSelectにオーディオを再生させたり止めたりするための変数の処理をいれます。

countはあってもなくてもよいです。何回送信したかを数えるための変数です。

btnStart.OnSelect = UpdateContext({count:0});

UpdateContext({running:false});
UpdateContext({running:true})

btnStop.OnSelect = UpdateContext({running:false})


オーディオに音楽を登録

FlowやPatchを実行したい間隔と同じ長さの音源を用意して登録します。

無音の音源であるとさらに良いです。

さらに繰り返し流れるようLoop=Trueとしておきます。

Audio1.Media = (音源)

Audio1.Loop = True


オーディオで送信処理

オーディオのStartrunningを登録し、Startボタンで音楽が流れるようにします。

またOnEndにFlowまたはPatchを実行する処理をいれます。

Flowや保存先はあらかじめ作っておきましょう。

またLocationは何も対策しないと一定時間更新されないようなのでDIsable(Location)Enable(Location)を入れて強制的に更新します。

Audio1.Start = running

Audio1.OnEnd = UpdateContext({count: count + 1});
Disable(Location);
Enable(Location);
Patch(sheet1,
{緯度:Location.Latitude,
経度:Location.Longitude,
高さ:Location.Altitude,
日時:Text(Now(),"[$-ja]yyyy/m/d hh:mm:ss")
}
)


実行回数を表示(任意)

繰り返しの回数を表示します。

lblCount.Text = "count: " & count

以上で完成です。


結果

他のアプリをアクティブにしていても画面を消しても音楽が繰り返し流れてそのたびにFlowやPatchが実行されます。

音楽が流れてちょっとうるさいので無音の音源が用意できるとよさそうです。

もし短い時間の音源を用意できれば現在時刻と差分を計算して好きな間隔で送信することもできます。

追記(2019/8/5 7:00)

画面を消した状態で一定時間経過すると止まることがあるようです。

もう少し検証します。

追記(2019/8/6 23:00)

一定時間で止まる課題ですが、OS側の設定を変更することで改善することがあるようです。

Androidでは確認していますがiOSは不明です。機種の問題もあるため私が確認できた範囲の方法を記しておきます。

以下の設定のいずれかまたは複数を設定してみてください。(@h-nagao さん 検証ありがとうございます!)


Androidの場合


  • 設定の「電池の最適化」にてPowerAppsアプリを「最適化しない」に設定する

  • 設定の「バッテリーセーバー」をOFFに設定する

  • バッテリーの減りを少なくさせるようなアプリを止める

PowerAppsをフォアグランドアプリと認識させる設定があれば上のような端末の設定は不要になりそうなのですが、今のところ見つけられていません。(参考)

追記(2019/8/12 9:00)

一定時間で止まる課題ですが、原因が複数あることが分かりました。


OS側でアプリを切られているケース

すでに記述した通り、電池の最適化等で裏に隠れたアプリが落とされるケースです。

電池の消耗を抑えるような設定をOFFにし、PowerAppsをアクティブにした状態で画面を消すと回避できました。


アカウントの選択画面が表示されて処理が中断するケース

Microsoftアカウントを選択する画面が表示されて再認証してくだいさい的な形で止まることがありました。

image.png

これは、Authenticatorアプリも電池の最適化をしない設定にすることで回避できました。

電池の消費率にどれだけ影響するか分かりませんが、私のスマホではこれらの設定で安定して計測してくれるようになりました。

PowerAppsをアクティブにして画面を消すのがちょっと面倒ですね。もう少し調査します。