真正的时间地图更新

时间:2019-10-27 11:23:16

标签: xamarin xamarin.forms xamarin.android

尽管我在移动设备时该方法未更新ui,但我正在使用google maps和android的Locations服务。我已请求允许使用我在移动设备时会假定的位置

locationObtained会在用户移动设备时获得lat的更新信息,而且很长一段时间,但这似乎只能获取一次。

double lat=0.00;
double lng=0.00;
var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);
if (status != PermissionStatus.Granted)
{
    if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
    {
         await DisplayAlert("Need location", "Gunna need that location", "OK                     
    }
    var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location);
         status = results[Permission.Location];
}
if (status == PermissionStatus.Granted)
{
    ILocation loc = DependencyService.Get<ILocation>();
    loc.locationObtained += (object ss, ILocationEventArgs ee) =>
    {
         loc.ObtainMyLocation();
         lat = ee.lat;
         lng = ee.lng;

         lbllat.Text = ee.lat.ToString();
         lbllong.Text = ee.lng.ToString();

    };
        Position position = new Position(lat, lng);
        map.Pins.Add(_pinTokyo2);    

    }
}

这是我用于通过依赖项服务获取位置的类。

namespace Fitnessbudy.Droid
{
    public class LocationEventArgs : EventArgs, ILocationEventArgs
    {
        public double lat { get; set; }
        public double lng { get; set; }
    }

    public class GetMyLocation : Java.Lang.Object, ILocation, ILocationListener
    {
        public event EventHandler<ILocationEventArgs> locationObtained;

        public void ObtainMyLocation()
        {
            LocationManager lm = (LocationManager)Forms.Context.GetSystemService(Context.LocationService);
            lm.RequestLocationUpdates(LocationManager.NetworkProvider, 0, 0, this);

        }

        public void OnLocationChanged(Location location)
        {
            if (location != null)
            {
                LocationEventArgs args = new LocationEventArgs();
                args.lat = location.Latitude;
                args.lng = location.Longitude;
                locationObtained(this, args);
            }
        }

        public void OnProviderDisabled(string provider)
        {
        }

        public void OnProviderEnabled(string provider)
        {
        }

        public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras)
        {
        }
    }
 }

这是我的清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.fitnessbudy" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <application android:label="Fitnessbudy.Android"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES" />
</manifest>

我确保我处于发布模式。这样就授予了权限。

1 个答案:

答案 0 :(得分:1)

您对loc.ObtainMyLocation的调用位于回调内部,因此不会初始化您的位置更新。

~~~
ILocation loc = DependencyService.Get<ILocation>();
loc.locationObtained += (object ss, ILocationEventArgs ee) =>
{
     lat = ee.lat;
     lng = ee.lng;

     lbllat.Text = ee.lat.ToString();
     lbllong.Text = ee.lng.ToString();

};
loc.ObtainMyLocation();
~~~