因此,我想获取用户位置并对其进行反向地理编码,以获取地址和街道号码。
因此,我安装了预发行版的Xamarin.Essentials软件包。我想使用地理定位和地理编码API,所以我写了一些代码,但是if (location != null)在尝试使用GetCurrentLocation时,这些代码永远无法到达。
我认为Xamarin.Essentials是否基于Xam.Plugin.Geolocator作者James Montemagno所说的预发行版并不重要:
我将继续工作和维护我的插件,但我建议您结帐Xamarin.Essentials,以查看它是否适合您的应用程序,因为它适用于我的所有应用程序!
我已搜索有关我遇到的问题的StackOverflow问题,但据我所知,找不到我能帮助我的问题。
我看过的问题:
我还尝试了添加超时是否可行: var request = new GeolocationRequest(GeolocationAccuracy.Medium, timeout: TimeSpan.MaxValue );
但是我在位置上也遇到了同样的问题。它从未到达if语句。
FillInLocationInForm(); 是在我的Page构造函数中设置的。
public Location location;并且public Placemark placemark;在Page类中设置。
这些是Page类中的相关功能:
public async void FillInLocationInForm()
{
if (await GetCurrentLocation())
{
if (await ReverseGeocodeLocation())
{
await this.DisplayAlert("Location", placemark.AdminArea + " " + placemark.FeatureName + " " + placemark.Locality + " " + …Run Code Online (Sandbox Code Playgroud) 我目前正在使用最新版本的 Xamarin.Forms (4.5.0.617) 和 Xamarin.Essentials (1.5.2)。
我有一个依赖项注入服务,负责访问电话联系人,它实际上是 Xamarin.Essentials 权限代码的包装器。我需要保证代码在UI线程上执行以避免异常。我已经得到了下面的代码,但是,它没有按我的预期工作。在我的应用程序中,出现权限弹出窗口并为我提供允许/拒绝的选择,但是 RequestAsync 之后的所有代码都无法执行,就像响应从未正式返回一样。下次我运行该应用程序时,它会立即运行(因此大概后台的权限已被正确记录)。
public async Task<bool> RequestAccessPhoneContacts()
{
PermissionStatus status = PermissionStatus.Denied;
status = await MainThread.InvokeOnMainThreadAsync<PermissionStatus>(async () =>
{
return await Permissions.RequestAsync<Permissions.ContactsRead>();
});
return (status == PermissionStatus.Granted);
}
Run Code Online (Sandbox Code Playgroud)
我不确定我尝试将代码强制到 UI 线程的方式是否引起了问题,或者我是否错误地使用了异步代码......或者(最有可能)这是否是一个错误Xamarin.Essentials 权限代码。目前我只在 Android 上看到过这种行为,但还没有在其他任何设备上进行过测试。
非常感谢任何帮助:)
谢谢!
我正在为我的 Xamarin.Forms 应用程序运行单元测试,并且单元测试抛出Xamarin.Essentials.NotImplementedInReferenceAssemblyException:
我为应用程序创建了一个单元测试项目(使用 NUnit 3.12.0)并编写了以下代码来测试功能。
[TestFixture()]
public class Test
{
[Test()]
public void TestCase()
{
AutoResetEvent autoEvent = new AutoResetEvent(true);
SomeClass someClass = new SomeClass();
someClass.SomeFunction((response) =>
{
Assert.AreEqual(response, "Hello")
autoEvent.Set();
});
autoEvent.WaitOne(); //** Xamarin.Essentials.NotImplementedInReferenceAssemblyException thrown here**
}
}
Run Code Online (Sandbox Code Playgroud)
下面是来自 Xamarin.Forms 应用程序的测试代码:
public class SomeClass
{
public void SomeFunction(Action<string> callback)
{
// asynchronous code...
callback("Hello");
}
}
Run Code Online (Sandbox Code Playgroud)
上述功能在 Xamarin.Forms 应用中运行良好。
注意:我读到可以使用 await/async,但是,我必须对整个项目进行更改。目前这不是一个可行的解决方案。
编辑 1: 我创建了一个示例 Xamarin.Forms 项目,其中包含单元测试。该项目可在此处获得
如何检测设备是小还是大?我不需要检测是否是平板电脑。
这个概念取自https://devblogs.microsoft.com/xamarin/styling-for-multiple-device-resolutions/
我们使用下面的方法并相应地加载适当的样式,但是因为我没有考虑密度,所以它不准确。
我怎样才能改进或重写这个方法,以便它给我一个更好的结果,并更准确地检测设备是大还是小。
当前的
const int smallWightResolution = 768;
const int smallHeightResolution = 1280;
public static bool IsASmallDevice()
{
// Get Metrics
var mainDisplayInfo = Xamarin.Essentials.DeviceDisplay.MainDisplayInfo;
// Width (in pixels)
var width = mainDisplayInfo.Width;
// Height (in pixels)
var height = mainDisplayInfo.Height;
return (width <= smallWightResolution && height <= smallHeightResolution);
}
Run Code Online (Sandbox Code Playgroud)
尝试使用密度但不知道公式是什么
public static bool IsSmallDevice()
{
//we don't support tablet so tablet don't apply.
int smallWidthResolution = 768;
int smallHeightResolution = 1280;
double screenWidth;
double screenHeight;
bool …Run Code Online (Sandbox Code Playgroud) 这是在 iPhone 6s 上的 iOS 12.1.4 上。通常Geolocation.GetLastKnownLocationAsync()有效,但有时无效。这是完全相同的代码,但如果我坐在这里一遍又一遍地按下“获取纬度和经度”按钮,最终会Geolocation.GetLastKnownLocationAsync()吐出一个空值。
你知道为什么会发生这种情况以及我该如何处理吗?也许把它放在一个循环中,尝试十次,在每次尝试之间等待一秒钟?
var location = await Essentials.Geolocation.GetLastKnownLocationAsync(); // works most of the time but sometimes it doesn't work.
Run Code Online (Sandbox Code Playgroud)
这是我建议的解决方法:
Essentials.Location location = null;
for(var i = 0; i < 10; i++)
{
location = await Essentials.Geolocation.GetLastKnownLocationAsync();
if(location == null)
{
Thread.Sleep(1000);
}
else
{
break;
}
}
Run Code Online (Sandbox Code Playgroud) 在我的Locationer课上,我有GetLocationAsync()使用 Xamarin.Essentials: Geolocation 的函数。这个函数工作正常,但我想为这个函数创建单元测试。
我创建了 xUnitTests 项目和单元测试:
public async Task LocationTest()
{
Locationer locationer = new Locationer();
var actual = locationer.GetLocationAsync();
Assert.Equal("test", actual);
}
Run Code Online (Sandbox Code Playgroud)
在 Xamarin Forms 项目中,GetLocationAsync()返回“纬度:46.55465,经度:15.64588,海拔:262”。
在我的单元测试中GetLocationAsync()返回“此程序集的便携式版本中未实现此功能”
是否可以在我的单元测试项目中使用 Xamarin.Essentials: Geolocation?我该如何解决?
我在 Android 上有一个 Xamarin Forms 应用程序,它使用 Xamarin.Essentials 库。
该应用程序需要在后台运行以获取位置数据(与当前的问题不是特别相关,但包含在上下文中),因此不得通过操作系统可能尝试的任何电池优化来使其进入睡眠状态。
我知道用户可以手动从电池优化中选择退出特定应用程序,但由于它对于应用程序的成功运行至关重要,我希望该应用程序能够:
和/或
我已在 AndroidManifest.xml 中添加了一个条目,但它似乎没有帮助,新安装的应用程序默认为电池优化。
该清单包含以下条目:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
Run Code Online (Sandbox Code Playgroud)
该库允许访问设备上的许多与权限相关的信息,但电池优化似乎不是其中之一。
我不知道这是否相关,但我正在三星 Galaxy S20 Ultra 上进行测试。
有人可以提供任何建议吗?
遵循贡献者的建议并参考https://learn.microsoft.com/en-us/xamarin/essentials/permissions?tabs=android#extending-permissions上的文档...
public interface IRequestIgnoreBatteryOptimizationPermission
{
Task<PermissionStatus> CheckStatusAsync();
Task<PermissionStatus> RequestAsync();
}
Run Code Online (Sandbox Code Playgroud)
[assembly: Xamarin.Forms.Dependency(typeof(RequestIgnoreBatteryOptimizationPermission))]
namespace MyAndroidProject
{
public class RequestIgnoreBatteryOptimizationPermission : Permissions.BasePlatformPermission, IRequestIgnoreBatteryOptimizationPermission
{
public override (string androidPermission, bool isRuntime)[] RequiredPermissions => new List<(string androidPermission, bool isRuntime)> …Run Code Online (Sandbox Code Playgroud) 更新到 Xamarin.Essentials v1.8.0 时,我的 Android 构建失败并出现以下错误:
error CS0234: The type or namespace name 'Platform' does not exist in the namespace 'Xamarin.Essentials'
Run Code Online (Sandbox Code Playgroud)
我检查了Xamarin.Essentials 源代码并确认该类Xamarin.Essentials.Platform仍然存在。
我唯一更改的是将 Xamarin.Essentials NuGet 包从 v1.7.7 更新到 v1.8.0。这不是一个主要版本,因此我的应用程序不应该有任何重大更改。Xamarin.Essentials 的此构建/版本有问题吗?
我在 Android 上的本机应用程序中打开 JPG 文件时遇到问题。我正在使用最新版本的 Xamarin Essentials,有一些名为 Launcher 的功能。这是我的代码
await Launcher.TryOpenAsync("file:///" + localPath);
Run Code Online (Sandbox Code Playgroud)
我的本地路径是存储在Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);.
每当我尝试打开该文件时,都会出现错误:
file:////data/user/0/mypackagename/files/.local/share/Screenshot.jpg exposed beyond app through Intent.getData()
Run Code Online (Sandbox Code Playgroud)
我在 stackoverflow 上找到了几个解决方案,但我不想使用 Intent,因为我的应用程序被设计为跨平台的(如果可能的话,我想避免原生平台编码)。
Launcher 在 iOS 上也抛出错误:
canOpenURL: failed for URL: ** -- file:///" - error: "This app is not allowed to query for scheme file
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
Vector3我正在尝试确定代表我的手机方向(没有角度)的3d 矢量。我正在寻找的是像射线一样从手机背面发出的矢量,基本上是手机的法线矢量。
我知道四元数给了我一个变换,但是变换什么呢?
此外,我发现Quaternion.ToAxisAngle(),它将四元数转换为轴及其各自的滚动角。我想,太好了,这就是我所需要的,我可以忽略角度。
当手机放在桌子上时,我得到以下轴:
axis = [0,0,-1]
Run Code Online (Sandbox Code Playgroud)
而角度基本上代表了指南针的角度。在那种特殊情况下,这正是我所期望的。但是,当手机具有不同的任意空间位置时,轴似乎不再是手机的法线向量。
如何计算手机平面的法向矢量?