앱을 열 때마다 위치가 켜져 있는지 꺼져 있는지 확인해야합니다. 위치가 꺼져 있는 경우 아래 스크린 샷과 같이 위치 공유를 활성화하라는 경고를 사용자에게 표시해야합니다.
이 스레드 의 종속성 서비스를 사용하여 이것을 시도합니다 .
공유 프로젝트의 인터페이스 :
public interface ILocSettings
{
void OpenSettings();
}
Android 구현
[assembly: Dependency(typeof(LocationShare))]
namespace ProjectName.Droid
{
public class LocationShare : ILocSettings
{
public void OpenSettings()
{
//code1
Android.App.Application.Context.StartActivity(new Android.Content.Intent(Android.Provider.Settings.ActionLocationSourceSettings));
//code2
//LocationManager LM = (LocationManager)Android.App.Application.Context.GetSystemService(Context.LocationService);
//if (LM.IsProviderEnabled(LocationManager.GpsProvider) == false)
//{
// Context ctx = Android.App.Application.Context;
// ctx.StartActivity(new Intent(Android.Provider.Settings.ActionLocationSourceSettings));
//}
}
}
}
마지막으로 아래와 같은 공유 프로젝트에서 :
var myAction = await DisplayAlert("Location", "Please Turn On Location", "OK", "CANCEL");
if (myAction)
{
if (Device.RuntimePlatform == global::Xamarin.Forms.Device.Android)
{
DependencyService.Get<ILocSettings>().OpenSettings();
}
}
else
{
await DisplayAlert("Alert", "User Denied Permission", "OK");
}
이것을 실행할 때 예외가 발생합니다. (code1 및 code2에 대해 동일한 예외가 발생 함)
System.NullReferenceException : '개체 참조가 개체의 인스턴스로 설정되지 않았습니다.'
위치가 꺼진 경우에만 경고를 표시해야합니다. 위치가 켜져 있으면 이러한 작업을 수행 할 필요가 없습니다. 위치가 켜져 있는지 꺼져 있는지 어떻게 확인할 수 있습니까?
또한 iOS 및 Windows 플랫폼에 대해 동일한 기능을 구현해야합니다.
안녕하세요 @Lucas Zhang-MSFT
난 당신의 솔루션을 시도하고 같은 경고 가지고 이 . 그러나 위치 액세스 권한을 부여한 후에도 여전히 장치의 위치 가 꺼져 있습니다. 내가 좋아하는 장치의 위치에 필요한 이 사용자가 탭하면 OK 경고 (질문 스크린 샷)에서 옵션을 선택합니다. 위치에서 직접 또는 위치 설정 페이지로 리디렉션합니다.
GeolocatorPlugin을 시도하고 GPS가 꺼져 있거나 켜져 있는지 확인하기 위해 아래 코드를 사용했습니다. GPS가 켜져 있어도 항상 False 값을 얻습니다.
public bool IsLocationAvailable()
{
if (!CrossGeolocator.IsSupported)
return false;
return CrossGeolocator.Current.IsGeolocationAvailable;
}
안드로이드 서비스에서 아래 수정을했고 이제 위치 설정을 열 수 있습니다.
public class LocationShare : ILocSettings
{
public void OpenSettings()
{
Intent intent = new Android.Content.Intent(Android.Provider.Settings.ActionLocationSourceSettings);
intent.AddFlags(ActivityFlags.NewTask);
Android.App.Application.Context.StartActivity(intent);
}
}
위치 설정 페이지를 열기 전에 GPS가 켜져 있는지 또는 꺼져 있는지 확인해야합니다 (위치 권한 아님).
또한 Jack의 iOS 답변을 이해하지 못했습니다. iOS 위치 설정 페이지를 열기 위해 Android에서했던 것처럼 iOS 종속성 서비스를 보여줄 수 있습니까?
귀하의 경우에는 Nuget의 PermissionsPlugin 플러그인을 사용할 수 있습니다 .
try
{
var status = await CrossPermissions.Current.CheckPermissionStatusAsync<LocationPermission>();
if (status != PermissionStatus.Granted)
{
if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
{
await DisplayAlert("Need location", "Gunna need that location", "OK");
}
status = await CrossPermissions.Current.RequestPermissionAsync<LocationPermission>();
}
if (status == PermissionStatus.Granted)
{
//Query permission
}
else if (status != PermissionStatus.Unknown)
{
//location denied
}
}
catch (Exception ex)
{
//Something went wrong
}
시스템 위치가 열려 있는지 확인하고 싶은 것 같군요? 그렇다면 위치 권한을 얻은 후 GPS 정보를 얻을 수 있습니다. 그래도 GPS 정보를 사용할 수 없으면 시스템 설정이 꺼져있는 것입니다. 종속성 서비스를 호출하여 플랫폼 설정 페이지를 열 수 있습니다.
public async void ShareLocation()
{
var status = await Permissions.RequestAsync<Permissions.LocationAlways>();
if (status == PermissionStatus.Granted)
{
bool gpsStatus = DependencyService.Get<ILocSettings>().isGpsAvailable();
if (!gpsStatus)
{
var myAction = await DisplayAlert("Location", "Please turn on GPS for the proper working of the application.", "TURN ON", "CANCEL");
if (myAction)
{
DependencyService.Get<ILocSettings>().OpenSettings();
}
}
}
}
//ILocSettings
public interface ILocSettings
{
void OpenSettings();
bool isGpsAvailable();
}
//Android Dependency Service
[assembly: Dependency(typeof(LocationShare))]
namespace Projectname.Droid.Services
{
public class LocationShare : ILocSettings
{
public bool isGpsAvailable()
{
bool value = false;
Android.Locations.LocationManager manager = (Android.Locations.LocationManager)Android.App.Application.Context.GetSystemService(Android.Content.Context.LocationService);
if (!manager.IsProviderEnabled(Android.Locations.LocationManager.GpsProvider))
{
//gps disable
value = false;
}
else
{
//Gps enable
value = true;
}
return value;
}
public void OpenSettings()
{
Intent intent = new Android.Content.Intent(Android.Provider.Settings.ActionLocationSourceSettings);
intent.AddFlags(ActivityFlags.NewTask);
Android.App.Application.Context.StartActivity(intent);
}
}
}
public void CheckAuthorization(CLLocationManager manager, CLAuthorizationStatus status)
{
switch (status)
{
case CLAuthorizationStatus.Authorized | CLAuthorizationStatus.AuthorizedAlways | CLAuthorizationStatus.AuthorizedWhenInUse:
Console.WriteLine("Access");
break;
case CLAuthorizationStatus.Denied | CLAuthorizationStatus.NotDetermined | CLAuthorizationStatus.Restricted:
Console.WriteLine("No Access");
break;
default:
Console.WriteLine("No Access");
break;
}
}
UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString));
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다