Using FusedLocationApi with Xamarin 3

本文关键字:Xamarin with FusedLocationApi Using | 更新日期: 2023-09-27 18:14:13

我有很多问题,当我试图使用FusedLocationApi从我的Xamarin活动。这里列出的Location Xamarin代码所使用的方法已被标记为过时,因此无法编译。我的实现如下。我的问题是,这是正确的方法还是我忽略了一些更简单的东西?LocationHandler被我的活动使用,例如OnCreate, OnResume, OnPause调用connect和disconnect方法。OnChangedLocation方法当然应该做一些更智能的事情。

using System;
using Android.Gms.Common;
using Android.Gms.Common.Apis;
using Android.Gms.Location;
using Android.Locations;
using Android.Util;
using Android.OS;
using Android.Content;

namespace WithKidsAndroid
{
    public class LocationHandler : Java.Lang.Object, IGoogleApiClientConnectionCallbacks, IGoogleApiClientOnConnectionFailedListener, Android.Gms.Location.ILocationListener
    {
        private IGoogleApiClient _googleAPI;
        private Context _context;
        public LocationHandler(Context context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            else
            {
                _context = context;
            }
            initializeGoogleAPI();
            LocRequest = new LocationRequest();
        }
        public LocationHandler(Context context, LocationRequest request)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            else
            {
                _context = context;
            }
            initializeGoogleAPI();
            LocRequest = request;
        }
        public LocationRequest LocRequest
        {
            get;
            set;
        }
        public void connectGoogleAPI()
        {
            System.Diagnostics.Debug.Assert(_googleAPI != null);
            if (!_googleAPI.IsConnectionCallbacksRegistered(this))
            {
                _googleAPI.RegisterConnectionCallbacks(this);
            }
            if (!_googleAPI.IsConnectionFailedListenerRegistered(this))
            {
                _googleAPI.RegisterConnectionFailedListener(this);
            }
            if (!_googleAPI.IsConnected || !_googleAPI.IsConnecting)
            {
                _googleAPI.Connect();
            }
        }
        public void disconnectGoogleAPI()
        {
            if (_googleAPI != null && _googleAPI.IsConnected)
            {
                if (_googleAPI.IsConnectionCallbacksRegistered(this))
                {
                    _googleAPI.UnregisterConnectionCallbacks(this);
                }
                if (_googleAPI.IsConnectionFailedListenerRegistered(this))
                {
                    _googleAPI.UnregisterConnectionFailedListener(this);
                }
                _googleAPI.Disconnect();
            }
        }

        public void OnConnected(Bundle connectionHint)
        {
            Log.Debug("LocationHandler", "logged connected", connectionHint);
            if (LocRequest == null)
            {
                throw new Exception("Unknown location request. Set this first by using property LocRequest or constructor.");
            }
            LocationServices.FusedLocationApi.RequestLocationUpdates(_googleAPI, LocRequest, this);
        }
        public void OnConnectionSuspended(int cause)
        {
            Log.Debug("LocationHandler", "logged OnConnectionSuspended", cause);
        }
        public void OnConnectionFailed(ConnectionResult result)
        {
            Log.Debug("LocationHandler", "logged OnConnectionFailed", result);
        }
        public void OnLocationChanged(Location location)
        {
            Log.Debug("LocationHandler", "logged location changed: " + location.ToString());
        }
        private void initializeGoogleAPI()
        {
            int queryResult = GooglePlayServicesUtil.IsGooglePlayServicesAvailable(_context);
            if (queryResult == ConnectionResult.Success)
            {
                _googleAPI = new GoogleApiClientBuilder(_context).AddApi(LocationServices.Api).AddConnectionCallbacks(this).AddOnConnectionFailedListener(this).Build();
            }
            else
            {
                var errorString = String.Format("There is a problem with Google Play Services on this device: {0} - {1}", queryResult, GooglePlayServicesUtil.GetErrorString(queryResult));
                Log.Error("WithKidsAndroid.LocationHandler", errorString);
                throw new Exception(errorString);
            }
        }

    }
}

Using FusedLocationApi with Xamarin 3

我想没有。我将关闭这个问题,但不会删除这个问题,因为人们可以找到一个工作的LocationServices的例子。