我的应用程序需要定期了解GPS
更新。我正在使用MonoForAndroid
,因此
我有许多从Windows继承的代码,我仍然与Windows和iOS共享此代码。
在当前的解决方案体系结构中,硬件相关元素在应用程序heirachy底部的不同层(HAL Hardware Abstraction Layer
)中分隔。
我想保持相同的架构,以便我不需要更改大量的移植代码。
我按照MonoForAndroid(receipe)http://docs.xamarin.com/recipes/android/os_device_resources/gps/get_current_device_location/
上的示例进行操作但是,这假定Activity
是Listener
。
问题:
如何在没有ILocationListener
的情况下实施Activity
。我发现ILocationListener
有一个Dispose()
方法和一个Handle
字段,我需要实现!!
当我尝试创建一个实现ILocationListener
的类并将其传递给LocationManager.RequestLocationUpdates()
时,我得到InvalidArgumentException
。我假设ILocationListener
的实施无效。
即使我Activity
实现listener
,我也会SystemRunTimeException
。
答案 0 :(得分:0)
我发现了这个问题。
首先:
实施ILocationListener
的类需要从Java.Lang.Object
开始,而不是从System.Object
开始
这是因为LocationListener
和Java Delvik
env中都需要存在.NET
。我从http://johnclaytonmoore.com/blog/monodroid-gps-listening得到了这个提示
继承自Java.Lang.Object
后,您无需实施Handle
属性和Dispose()
方法
第二
SystemRunTimeException
被抛出,因为Android期望设置在MainLooper
线程上发生。
我使用Applicatoin.Context
执行此操作而无需引用Activity
,如下所示:
var handler = new Handler(Application.Context.MainLooper);
handler.Post(SetupLocationUpdatesListener);
private void SetupLocationUpdatesListener()
{
_AndroidLocationUpdatesReceiver = new AndroidLocationListener();
_LocationManager.RequestLocationUpdates(LocationManager.GpsProvider, GpsFilters.MinimumGpsUpdatesTimeIntervalInMiliSeconds, GpsFilters.DistanceInMeters, _AndroidLocationUpdatesReceiver);
_LocationManager.RequestLocationUpdates(LocationManager.NetworkProvider, GpsFilters.MinimumGpsUpdatesTimeIntervalInMiliSeconds, GpsFilters.DistanceInMeters, _AndroidLocationUpdatesReceiver);
HookGpsEvents();
}
如果您对LocationListener的完整代码感兴趣,我已在我的博客上发布了整个内容,这里有一个链接