Call input.location.Start() but status keeps to be Stopped.
I'm trying to implement getting location feature. The code below works like a charm in test project but it doesn't work in my real project. Calling Input.location.Start() doesn't bring any effect to Input.location.status. This app has permission. Original both project works in Unity 2020.3.4f1. I changed Unity version of real project to 2020.3.13 but result is same.
RequestUserPermission works fine but calling Input.location.Start() seems not work.
There is use feature entry in AndroidManifest.
I wanna know what causes these different result in two project with same code. Any info is really helpful. Regards,
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
# if PLATFORM_ANDROID
using UnityEngine.Android;
# endif
public class Gyro : MonoBehaviour
{
private string _gpsStage = "-";
GameObject dialog = null;
public float latitude;
public float longitude;
public float altitude;
[SerializeField] private Text _text;
private bool _gpsStopped;
private bool _permissionRequested;
private void Start()
{
StartCoroutine(Loop());
DontDestroyOnLoad(gameObject);
Input.gyro.enabled = true;
Input.compass.enabled = true;
}
public void RequestPermission()
{
Debug.Log("RequestPermission");
#if UNITY_ANDROID
Debug.Log("RequestPermission2");
Permission.RequestUserPermission(Permission.CoarseLocation);
_permissionRequested = true;
#endif
}
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
}
}
public void StartLocation()
{
Debug.Log("");
_gpsStopped = false;
_gpsStage = "";
latitude = float.NaN;
longitude = float.NaN;
StartCoroutine(StartLocationService(0));
}
public void StopLocation()
{
_gpsStopped = true;
if(Input.location.status==LocationServiceStatus.Initializing||
Input.location.status==LocationServiceStatus.Running)
Input.location.Stop();
}
IEnumerator Loop()
{
while (true)
{
yield return new WaitForSeconds(0.1f);
var nl = System.Environment.NewLine;
_text.text = $"{DateTime.Now} isEByUser={Input.location.isEnabledByUser} status={Input.location.status} {nl}"+
#if UNITY_ANDROID
$"hasPermission={Permission.HasUserAuthorizedPermission(Permission.CoarseLocation)}{nl}"+
#endif
$"stage={_gpsStage} gpsStopped={_gpsStopped}{nl}la={latitude:F3} lo={longitude:F3} al={altitude:F3}{nl}"+
$"q={Input.gyro.attitude.eulerAngles}{nl}deg={Input.compass.magneticHeading:F2}{nl}"+
$"tH={Input.compass.trueHeading}{nl}"+
$"rawVec={Input.compass.rawVector}{nl}";
}
}
private IEnumerator StartLocationService(float wait)
{
yield return new WaitForSeconds(wait);
_gpsStage = "starting...";
yield return new WaitForSeconds(0.5f);
// First, check if user has location service enabled
if (!Input.location.isEnabledByUser)
{
Debug.Log("GPS not enabled");
_gpsStage = "not enabled";
yield break;
}
_gpsStage = "start";
// Start service before querying location
Input.location.Start();
_gpsStage = "waiting not stopped";
//this is needed to make location service to work fine after requesting permission.
while (Input.location.status == LocationServiceStatus.Stopped)
{
yield return new WaitForSeconds(1);
Debug.Log("...waiting");
Input.location.Start();
//Debug.Log("call Start again---");
}
// Wait until service initializes
int maxWait = 20;
while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
{
yield return new WaitForSeconds(1);
maxWait--;
}
_gpsStage = $"stopped changed to {Input.location.status}";
// Set locational infomations
while (!_gpsStopped) {
if (Input.location.status == LocationServiceStatus.Running)
{
latitude = Input.location.lastData.latitude;
longitude = Input.location.lastData.longitude;
altitude = Input.location.lastData.altitude;
}
yield return new WaitForSeconds(5);
}
_gpsStage = "stopped";
}
}
I deleted almost script, asset, package and so on except test scene and test script. It works. I don't know what causes this strange behaviour. I'll try to delete one by one and detect what causes it.
Your answer

Follow this Question
Related Questions
Android Input Location Crash 0 Answers
Find y position of player 1 Answer