我正在学习通过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)]
我的应用程序不请求启动时的权限。发生了什么事?
答案 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
选项面板:
其次,如果定位Marshmallow / API-23或更高版本,请确保您要求运行时位置权限( 和 仍然包含清单中的权限条目)。< / p>
https://blog.xamarin.com/requesting-runtime-permissions-in-android-marshmallow/
注意:如果您没有使用您定义的位置条件,则需要将其传递到GetProviders
方法:
IList<string> acceptableLocationProviders = _mgr.GetProviders(locCriteria, false);