Android Geolocation.GetLocationAsync不工作

Android Geolocation.GetLocationAsync不工作,android,xamarin.forms,xamarin.essentials,Android,Xamarin.forms,Xamarin.essentials,我有一个Xamarin.Forms应用程序,支持UWP、iOS和Android。具体来说,我现在正在Android emulator上测试我的应用程序。为了获得位置,我使用了Xamarin.Essentials。以下是我的代码片段: 在页面模型中: bu = await GeolocationSrvc.GetBusinessUnitAsync(); 下面是上述方法的实现: public static async Task<BusinessU

我有一个Xamarin.Forms应用程序,支持UWP、iOS和Android。具体来说,我现在正在Android emulator上测试我的应用程序。为了获得位置,我使用了Xamarin.Essentials。以下是我的代码片段:

在页面模型中:

                    bu = await GeolocationSrvc.GetBusinessUnitAsync();
下面是上述方法的实现:

    public static async Task<BusinessUnits> GetBusinessUnitAsync()
    {
        BusinessUnits bu = BusinessUnits.Aus;

        try
        {
            Location location = await GetLocation().ConfigureAwait(false);

            IEnumerable<Placemark> placemarks = await Geocoding.GetPlacemarksAsync(location);
            Placemark placemark = placemarks?.FirstOrDefault();
            string countryCode = placemark?.CountryCode;

            switch (countryCode)
            {
                case "AQ":
                case "AU":
                case "NZ":
                    bu = BusinessUnits.Aus;
                    break;
                default:
                    bu = BusinessUnits.NA;
                    break;
            }
        }
        catch (Exception)
        {
            throw;
        }

        return bu;
    }

    private static Task<Location> GetLocation()
    {
        GeolocationRequest request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));
        TaskCompletionSource<Location> locationTaskCompletionSource = new TaskCompletionSource<Location>();

        Device.BeginInvokeOnMainThread(async () =>
        {
            locationTaskCompletionSource.SetResult(await Geolocation.GetLocationAsync(request));
        });

        return locationTaskCompletionSource.Task;
    }
有人问我是否允许应用程序获取我的位置。如果我按Yes,它将按预期工作。但是如果我按No,则永远不会返回位置(甚至不为null),下面的代码永远不会执行。我希望在回答“否”时使用中设置的默认值

BusinessUnits bu = BusinessUnits.Aus;

但事实并非如此

您没有设置
任务完成源
对象的
异常

private static Task<Location> GetLocation()
{
    GeolocationRequest request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));
    TaskCompletionSource<Location> locationTaskCompletionSource = new TaskCompletionSource<Location>();

    Device.BeginInvokeOnMainThread(async () =>
    {
        try
        {
            locationTaskCompletionSource.SetResult(await Geolocation.GetLocationAsync(request));
        }
        catch(Exception exception)
        {
            locationTaskCompletionSource.SetException(exception);
            locationTaskCompletionSource.SetResult(null);
        }
    });

    return locationTaskCompletionSource.Task;
}
private静态任务GetLocation()
{
GeolocationRequest=新的GeolocationRequest(GeolocationAccuracy.Medium,TimeSpan.FromSeconds(10));
TaskCompletionSource位置TaskCompletionSource=新TaskCompletionSource();
Device.beginInvokeMainThread(异步()=>
{
尝试
{
locationTaskCompletionSource.SetResult(等待Geolocation.GetLocationAsync(请求));
}
捕获(异常)
{
locationTaskCompletionSource.SetException(异常);
locationTaskCompletionSource.SetResult(空);
}
});
返回locationTaskCompletionSource.Task;
}

您没有设置
任务完成源
对象的
异常

private static Task<Location> GetLocation()
{
    GeolocationRequest request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));
    TaskCompletionSource<Location> locationTaskCompletionSource = new TaskCompletionSource<Location>();

    Device.BeginInvokeOnMainThread(async () =>
    {
        try
        {
            locationTaskCompletionSource.SetResult(await Geolocation.GetLocationAsync(request));
        }
        catch(Exception exception)
        {
            locationTaskCompletionSource.SetException(exception);
            locationTaskCompletionSource.SetResult(null);
        }
    });

    return locationTaskCompletionSource.Task;
}
private静态任务GetLocation()
{
GeolocationRequest=新的GeolocationRequest(GeolocationAccuracy.Medium,TimeSpan.FromSeconds(10));
TaskCompletionSource位置TaskCompletionSource=新TaskCompletionSource();
Device.beginInvokeMainThread(异步()=>
{
尝试
{
locationTaskCompletionSource.SetResult(等待Geolocation.GetLocationAsync(请求));
}
捕获(异常)
{
locationTaskCompletionSource.SetException(异常);
locationTaskCompletionSource.SetResult(空);
}
});
返回locationTaskCompletionSource.Task;
}

另一种方法是在为每个平台使用简单的依赖关系服务之前检查位置权限

如果已授予权限,则继续进行位置提取。否则提示用户获取权限

对于例如Android实现,检查位置权限:

public bool IsLocationPermissionGranted()
{
    if (ContextCompat.CheckSelfPermission(Application.Context, 
    Manifest.Permission.AccessFineLocation) == Permission.Granted)
    {
        return true;
    }
    return false;
}

另一种方法是在为每个平台使用简单的依赖关系服务之前检查位置权限

如果已授予权限,则继续进行位置提取。否则提示用户获取权限

对于例如Android实现,检查位置权限:

public bool IsLocationPermissionGranted()
{
    if (ContextCompat.CheckSelfPermission(Application.Context, 
    Manifest.Permission.AccessFineLocation) == Permission.Granted)
    {
        return true;
    }
    return false;
}

你试过调试它吗?@Jason是的,当然。这就是我知道我在问题中写了什么的原因。你试过调试它吗?@Jason是的,当然。这就是我知道我在问题中写了什么的原因。谢谢你的回答。我现在就试试。谢谢你的回答。我现在就试试。谢谢你的建议。它起作用了,所以现在我可以知道是否有许可。您能告诉我,如果用户选择,如何将权限设置为true吗?另外,在调用Geolocation.GetLocationAsync()时,如何防止自动再次询问它?也许你们有iOS和UWP的实现?很抱歉问了这么多问题。获取用户权限通常是一次性任务,除非用户决定从应用程序设置手动撤销权限。一旦用户授予了权限,它就会被操作系统持久化,所以您不需要跟踪它。但每次启动位置提取请求之前,您都需要检查它。我理解这一点。但如果权限检查返回false,我会显示一条消息,要求用户提供权限,他说是,我如何设置它以让操作系统知道?当用户说是时,操作系统会自动为您的应用程序注册该权限。所以下次你检查的时候,你会得到许可的。当然。啊…现在我明白了。你是对的,如果还没有获得许可,那么你就必须去问它。为此,您可以在依赖项服务中编写另一个函数。或者你可以使用我前面提到的插件。这个插件处理权限检查和请求。并支持您针对的所有三个平台。请仔细阅读它的文档。谢谢你的建议。它起作用了,所以现在我可以知道是否有许可。您能告诉我,如果用户选择,如何将权限设置为true吗?另外,在调用Geolocation.GetLocationAsync()时,如何防止自动再次询问它?也许你们有iOS和UWP的实现?很抱歉问了这么多问题。获取用户权限通常是一次性任务,除非用户决定从应用程序设置手动撤销权限。一旦用户授予了权限,它就会被操作系统持久化,所以您不需要跟踪它。但每次启动位置提取请求之前,您都需要检查它。我理解这一点。但如果权限检查返回false,我会显示一条消息,要求用户提供权限,他说是,我如何设置它以让操作系统知道?当用户说是时,操作系统会自动为您的应用程序注册该权限。所以下次你检查的时候,你会得到许可的。当然。啊…现在我明白了。你是对的,如果还没有获得许可,那么你就必须去问它。为此,您可以在依赖项服务中编写另一个函数。或者你可以使用我前面提到的插件。这个插件处理权限检查和请求。并支持您针对的所有三个平台。请看一下它的文件。