Xamarin.Android - 获取位置提供者每次都返回空

时间:2018-04-13 23:31:41

标签: c# xamarin xamarin.android

我正在学习通过Xamarin为Android开发,我正在关注Xamarin网站上的this基础教程。我创建了一个类级变量LocationManager _mgr;,并在我的InitializeLocationManager();方法中调用了OnCreate(Bundle bundle)InitializeLocationManager()的实施方式如下:

    public void InitializeLocationManager()
    {
        _mgr = (LocationManager)GetSystemService(LocationService);
        Criteria locCriteria = new Criteria { Accuracy = Accuracy.Coarse, PowerRequirement = Power.Medium };
        IList<string> acceptableLocationProviders = _mgr.GetProviders(false);
        if (acceptableLocationProviders.Any())
        {
            locationProvider = acceptableLocationProviders.First();
        }
        else
        {
            locationProvider = string.Empty;
        }
        Console.WriteLine($"Using {locationProvider} as our location provider.");
    }

Criteria locCriteria = new Criteria { Accuracy = Accuracy.Coarse, PowerRequirement = Power.Medium };与教程不同,因为在我的故障排除过程中,有人说它对他们有效。当我只使用Accuracy = Accuracy.Fine时,我会得到完全相同的结果。

每次写入控制台的行是Using as our location provider",显然是空字符串。

类(MainActivity)从Activity扩展并正确实现ILocationListener。声明代码文件使用System.Linq,因此IList方法.Any().First()都能正常工作。

为什么这不起作用?除了一些变量名之外,我几乎完全遵循了教程。我已确保使用我的测试设备打开了位置。我不是在WiFi上,当我在,它仍然没有工作。我正在使用4G LTE,但它不起作用。

非常感谢任何想法。

非常感谢。

编辑:更新:我在OnCreate()方法中添加了以下代码:

        if( ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == Android.Content.PM.Permission.Granted )
        {
            Console.WriteLine($"We've got permission!");
        }
        else
        {
            Console.WriteLine($"We don't have permission you idiot!");
        }

每次写的行都是We don't have permission you idiot!。我的AndroidManifest.xml有以下几行:

<uses-sdk android:minSdkVersion="24" android:targetSdkVersion="27" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<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.LOCATION_HARDWARE" />

<uses-feature android:name="android.hardware.location.gps" />

<application android:allowBackup="true" android:label="@string/app_name"></application>

我的AssemblyInfo.cs文件包含这些行,就像教程一样:

[assembly: UsesPermission(Manifest.Permission.Internet)]
[assembly: UsesPermission(Manifest.Permission.AccessFineLocation)]
[assembly: UsesPermission(Manifest.Permission.AccessCoarseLocation)]

我的应用程序请求启动时的权限。发生了什么事?

1 个答案:

答案 0 :(得分:1)

如果LocationManager.GetProviders在请求提供商时返回 Java ArrayList,即使它们已关闭/不可用,那么您有请求的权限位置。

首先,手动将权限添加到清单:

 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

甚至更好,使用Build / Android application / Required Permissions选项面板:

enter image description here

其次,如果定位Marshmallow / API-23或更高版本,请确保您要求运行时位置权限( 仍然包含清单中的权限条目)。< / p>

https://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/

注意:如果您没有使用您定义的位置条件,则需要将其传递到GetProviders方法:

IList<string> acceptableLocationProviders = _mgr.GetProviders(locCriteria, false);