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---");
        }

docs.unity3d.com