Unity Androidでのlocation情報の取得
とりあえずAndroidについて雑にまとめ。Input.locationの使い方などは色々他の人が書いてるから調べたとこだけ。
開始
Input.location.Start(); Permissionがないとダメ。
Permission持ってるか
(UnityEngine.Android.)Permission.HasUserAuthorizedPermission(Permission.CoarseLocation)
ダイアログ表示してPermission取得
Permission.RequestUserPermission(Permission.CoarseLocation);
Permission取得後の再Start
ダイアログを閉じるとOnApplicationPause(false)が呼ばれるのでそこでPermission取得の際にフラグを立てていたものなどをチェックしてpermission取得後であれば再スタート。再スタートしないとステータスは変わらない。
void OnApplicationPause(bool pauseStatus) { Debug.Log($"OnApplicationPause ={pauseStatus}"); // check flag if (!pauseStatus && _permissionRequested) { #if UNITY_ANDROID // has permission? if (Permission.HasUserAuthorizedPermission(Permission.CoarseLocation)) { Debug.Log("got permission"); //do something if got permission StartCoroutine(StartLocationService(0)); _permissionRequested = false; } #endif } }
再Start後のstatusチェック
公式ドキュメントLocationService-Start - Unity スクリプトリファレンスでは触れてない気がするのだけれど、Permission取った後だとこのコードだと動かない。元からPermissionある場合は問題ない。 Input.location.statusがStoppedのままなのでInitializingに変わるのを待つ必要がある。 これが正しいやり方なのかはわからないけれどとりあえず動く。
// Start service before querying location Input.location.Start(); // Wait until status changes while (Input.location.status == LocationServiceStatus.Stopped) { yield return new WaitForSeconds(1); Debug.Log("...waiting"); Input.location.Start();//改めて呼ばないとダメ。理由はわからない Debug.Log("call Start again---"); }