问题描述
我正在使用 xamarin 构建本机 android 应用程序.问题是,该应用程序在模拟器上完美地收集和显示坐标,但是当我将它放在智能手机上(尝试了 2 部三星手机)时,它无法确定当前地址.额外的信息数据和位置已打开,所以我不确定问题出在哪里.谢谢你的帮助.这是帮助 https://developer.xamarin.com/的 xammarin 配方包装食谱/android/os_device_resources/gps/get_current_device_location/
I am building a native android app using xamarin. The issue is, that the application collects and displays the coordinates perfectly on the emulator but when I put it on a smartphone (tried 2 samsung phones) it comes up with can't determine the current address. Extra information data and locations are turned on so I am not sure where the issue is. Thanks for your help. here is the xammarin recipe encase that helps https://developer.xamarin.com/recipes/android/os_device_resources/gps/get_current_device_location/
[Activity(Label = "NewRoute")]
public class NewRouteActivity : Activity, ILocationListener
{
static readonly string TAG = "X:" + typeof(NewRouteActivity).Name;
TextView _addressText;
Location _currentLocation;
LocationManager _locationManager;
string _locationProvider;
TextView _locationText;
public async void OnLocationChanged(Location location) {
_currentLocation = location;
if (_currentLocation == null)
{
_locationText.Text = "Unable to determine your location. Try again in a short while.";
}
else
{
_locationText.Text = string.Format("{0:f6},{1:f6}", _currentLocation.Latitude, _currentLocation.Longitude);
Address address = await ReverseGeocodeCurrentLocation();
DisplayAddress(address);
}
}
public void OnProviderDisabled(string provider) { }
public void OnProviderEnabled(string provider) { }
public void OnStatusChanged(string provider, Availability status, Bundle extras) { }
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.CreatetRoute);
_addressText = FindViewById<TextView>(Resource.Id.address_text);
_locationText = FindViewById<TextView>(Resource.Id.location_text);
FindViewById<TextView>(Resource.Id.get_address_button).Click += AddressButton_OnClick;
InitializeLocationManager();
Button btnEndPoint = FindViewById<Button>(Resource.Id.btnEndPoint);
btnEndPoint.Click += new EventHandler(AfterPointsCollected);
}
//Location Stuff
void InitializeLocationManager()
{
_locationManager = (LocationManager)GetSystemService(LocationService);
Criteria criteriaForLocationService = new Criteria
{
Accuracy = Accuracy.Fine
};
IList<string> acceptableLocationProviders = _locationManager.GetProviders(criteriaForLocationService, true);
if (acceptableLocationProviders.Any())
{
_locationProvider = acceptableLocationProviders.First();
}
else
{
_locationProvider = string.Empty;
}
Log.Debug(TAG, "Using " + _locationProvider + ".");
}
//Override OnResume so that Activity1 will begin listening to the LocationManager when the activity comes into the foreground:
protected override void OnResume()
{
base.OnResume();
_locationManager.RequestLocationUpdates(_locationProvider, 0, 0, this);
}
async void AddressButton_OnClick(object sender, EventArgs eventArgs)
{
if (_currentLocation == null)
{
_addressText.Text = "Can't determine the current address. Try again in a few minutes.";
return;
}
Address address = await ReverseGeocodeCurrentLocation();
DisplayAddress(address);
}
async Task<Address> ReverseGeocodeCurrentLocation()
{
Geocoder geocoder = new Geocoder(this);
IList<Address> addressList =
await geocoder.GetFromLocationAsync(_currentLocation.Latitude, _currentLocation.Longitude, 10);
Address address = addressList.FirstOrDefault();
return address;
}
void DisplayAddress(Address address)
{
if (address != null)
{
StringBuilder deviceAddress = new StringBuilder();
for (int i = 0; i < address.MaxAddressLineIndex; i++)
{
deviceAddress.AppendLine(address.GetAddressLine(i));
}
// Remove the last comma from the end of the address.
_addressText.Text = deviceAddress.ToString();
}
else
{
_addressText.Text = "Unable to determine the address. Try again in a few minutes.";
}
}
//Override OnPause and unsubscribe Activity1 from the LocationManager when the activity goes into the background:
protected override void OnPause()
{
base.OnPause();
_locationManager.RemoveUpdates(this);
}
//Changing Activity
void AfterPointsCollected(object sender, EventArgs e)
{
//context //activity
Intent intent = new Intent(this, typeof(AfterPointsCollectedActivity));
//starts the activity with the intent above
this.StartActivity(intent);
}
推荐答案
您的手机可能正在运行 MarshMallow,现在需要您请求位置服务权限.
Your phones are probably running MarshMallow which now require that you request permission for location services.
您可以在此处阅读有关它的更多信息 https://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/.您可能想要使用这个 Nuget 包来为您处理所有这些.https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Geolocator
You can read more about it here https://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/. You might want to use this Nuget package that handles all that for you. https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Geolocator
这篇关于收集 GPS 坐标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!