当前位置: 首页 > 知识库问答 >
问题:

Google Play服务-位置Xamarin Android

王景山
2023-03-14

我在我的应用程序中实现了谷歌播放服务背景位置跟踪。我以前用过位置管理器,但它在一些设备上不起作用。

在使用设备时有很奇怪的事情。自从我发布GooglePlayServices以来,包括我在内的大多数设备发送的位置日志都有很大的偏差。

数据库中有位置

//...
Latitude    Longitude   Provider    Accuracy
51,0994253  17,1077168  fused   21,5179996490479
51,0994253  17,1077168  fused   21,5179996490479
51,0996427  17,1076683  fused   21,7150001525879
51,0996427  17,1076683  fused   21,7150001525879
51,0996427  17,1076683  fused   21,7150001525879
51,1003416  17,1079516  fused   8
51,1003416  17,1079516  fused   8
51,1003416  17,1079516  fused   8
51,1008037  17,1083013  fused   8
51,1008037  17,1083013  fused   8
51,1008037  17,1083013  fused   8
51,0997649  17,0375168  fused   20               //Strange point
51,0997649  17,0375168  fused   20
51,0997649  17,0375168  fused   20
51,1094489  17,065886   fused   21,1340007781982
51,1094489  17,065886   fused   21,1340007781982
51,1094489  17,065886   fused   21,1340007781982
//....
public class GoogleApiLocationManager : Java.Lang.Object, IResultCallback, ILocationListener
{
    public GoogleApiLocationManager(Context context, GoogleApiManagerMode requestMode)
        {
            _requestMode = requestMode;
            _context = context;
            _client = new GoogleApiClient.Builder(context)
                .AddConnectionCallbacks(OnGoogleConnected)
                .AddOnConnectionFailedListener(OnGoogleConnectFailed)
                .AddApi(LocationServices.API)
                .Build();
            _client.Connect();
        }

         public void OnGoogleConnected()
        {
            switch (_requestMode)
            {
                case GoogleApiManagerMode.LastKnownLocation:
                    SaveLastKnownLocation();
                    break;
                case GoogleApiManagerMode.RequestNewLocation:
                    RunLocationRequest();
                    break;
            }
        }

        public void OnResult(Java.Lang.Object result)
        {
            var locationSettingsResult = (LocationSettingsResult)result;
            try
            {
                switch (locationSettingsResult.Status.StatusCode)
                {
                    case CommonStatusCodes.Success:
                        LocationServices.FusedLocationApi.RequestLocationUpdates(_client, _locationRequest, this);
                        break;
                    case CommonStatusCodes.ResolutionRequired:
                        Toast.MakeText(_context, "Could not get location. Please enable high accuracy in location settings", ToastLength.Short);
                        var intent = new Intent(Settings.ActionLocationSourceSettings);
                        intent.AddFlags(ActivityFlags.NewTask);
                        _context.StartActivity(intent);
                        break;
                    case LocationSettingsStatusCodes.SettingsChangeUnavailable:
                        //TODO:
                        break;
                }
            }
            catch (Exception e)
            {
                //TODO:
            }
        }

        private void SaveLastKnownLocation()
        {
           //Store to database
           _client.Disconnect();
        }

        private void RunLocationRequest()
        {
            _locationRequest = CreateLocationRequest();
            var builder = new           
                  LocationSettingsRequest.Builder().AddLocationRequest(_locationRequest);
            var pendingResult = LocationServices.SettingsApi.CheckLocationSettings(_client, builder.Build());
            pendingResult.SetResultCallback(this);
        }

         private LocationRequest CreateLocationRequest()
    {
        _locationRequest = new LocationRequest();
        _locationRequest.SetInterval((long)_triggerInterval.TotalMilliseconds);
        _locationRequest.SetFastestInterval((long)_triggerInterval.TotalMilliseconds / 2);
        _locationRequest.SetPriority(LocationRequest.PriorityHighAccuracy);

        return _locationRequest;
    }
}
[BroadcastReceiver]
public class AlarmReciver : BroadcastReceiver
{
   //some login to wakeup each 2 minutes...

   //runs google api manager each period
    private void RunLocationManager()
        {
            new GoogleApiLocationManager(_context, GoogleApiManagerMode.LastKnownLocation);
            new GoogleApiLocationManager(_context, GoogleApiManagerMode.RequestNewLocation);
        }
}

共有1个答案

邰昀
2023-03-14

在定义locationrequest时,如果不要求高精度,则保险丝提供商将使用最低功耗选项向您返回位置。这通常是一个仅基于WiFi的位置,只有谷歌映射的位置准确。

当然,手机需要打开wifi、蜂窝和GPS/定位服务,以提供与融合供应商的最佳结果。

AccessFineLocation添加到您的清单权限中,并将LocationRequest优先级设置为高精度,以便启动GPS并对您的位置进行采样并重新检查结果。

LocationRequest _locationRequest = new LocationRequest()
    .SetPriority(LocationRequest.PriorityHighAccuracy);
 类似资料:
  • 13.2.位置服务 前面已对传感器服务的工作方式有所了解,接下来看下位置服务的 API。同传感器服务类似,位置服务是通过LocationManager进行管理,而且也是通过 getSystemService() 获取它的引用。 使用位置服务,我们需要传递给它一个侦听器(Listener),这一来在位置改变的时候可以作出响应。同前面相似,我们在这里实现一个LocationListener接口。 "使

  • 我想在我的LibGDX Android游戏中使用Google Play Game Services API的成就和排行榜。我所做的唯一一件事就是从游戏服务开发者网站上获取运行的示例。我已经尝试在我的项目中使用这段代码很多天了,但仍然一无所获。我也尝试过学习本教程http://helios.hud.ac.uk/u1070589/blog/?p=202但我没有“主游戏类(从ApplicationLis

  • 我需要每1分钟和每5米位移更新一次熔合位置(我知道这是一个错误的做法,但为了测试和在日志中显示),并且我在按下按钮后立即启动服务,我在logcat中获得位置,但只有一次。根据服务级别,onLocationChanged应该每1分钟调用一次,但它不会再次调用,即使我的GPS几乎每分钟打开一次,然后在之后关闭,但Logcat中仍然没有位置更新。我需要服务类来保持更新位置,而不影响UI或主线程 这是只显

  • 我正在努力得到最准确的位置。 迄今为止,I'v在Google docs中成功使用了LocationClient:http://developer.android.com/training/location/retrieve-current.html 但是现在我发现这个班已经老了:http://developer.android.com/reference/com/google/android/gm

  • 13.3.用上位置服务,重构Yamba WhereAmI程序只是用来演示位置服务使用方法的小样例。接下来,我们将位置服务应用到Yamba里面。

  • 我正在尝试使用Firebase消息传递(web)。默认情况下,Firebase会搜索包含服务工作者的文件“Firebase messaging sw.js”。 服务工作者脚本应位于应用程序的绝对路径上!例如:http://localhost/firebase-messaging-sw.js 如何更改此默认位置?!搜索官方文档,我发现了这个方法:,它接受服务工作者注册,但试图使用它,我得到一个错误,