有没有人知道如何提供自己的LocationProvider并将其发布到系统中,以便其他应用程序可以从LocationManager获取对它的引用?
有没有人知道如何提供自己的LocationProvider并将其发布到系统中,以便其他应用程序可以从LocationManager获取对它的引用?
为了开发和测试,您可以实现一个模拟位置提供程序。您需要在开发人员选项中启用“允许模拟位置”,以便应用程序可以看到该提供程序的位置。
要查看代码示例,请参阅 GPX Playback:
https://github.com/johncarpenter/Android-GPX-Mock-Location-Provider
注册位置提供程序的代码从文件 android/src/com/twolinessoftware/android/PlaybackService.java
的第203行开始。
如果您需要使用“真实”的位置提供程序(例如将您的功能部署为最终用户应用程序的一部分),某些来源说,除非该提供程序在与系统密钥签名的软件包中,否则无法完成,因此您必须从源代码构建自己的ROM,使用您的密钥对其进行签名,将您的位置提供程序与相同的密钥进行签名并安装到手机上。
不过,Android在某个时候引入了“非捆绑”位置提供程序。显然,他们需要这样做才能将自己的 NetworkLocationProvider 从 Android 核心移动到 Google 应用包中。
我还没有看到过非捆绑位置提供程序在实践中的工作情况,也不知道任何使用它的开源代码,但是看起来最近的 Android 版本支持“售后”位置提供程序。
相关库的源代码在此处:
https://github.com/CyanogenMod/android_frameworks_base/tree/cm-10.1/location/lib
位置提供程序必须扩展 com.android.location.provider.LocationProviderBase
。
类和方法在代码中有文档说明。
编辑:查看
https://github.com/android/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml
从第607行开始看起,似乎INSTALL_LOCATION_PROVIDER
权限的保护级别是signatureOrSystem
。这意味着使用此功能的任何应用程序(即安装位置提供程序,不一定是位置提供程序本身)都需要使用与平台相同的密钥进行签名(这将要求您从源代码构建整个Android系统),或者作为系统应用程序安装(这可能适用于已root的设备)。
在https://github.com/microg/NetworkLocation上有一些代码似乎实现了一个位置提供程序。我还没有仔细研究它或构建它,因此我无法说它是否可行以及需要什么。但也许它能提供一些指导。
这是不可能的。
问题在于只有原始设备制造商才被允许安装新的位置提供程序。第三方开发者无法授予他/她的应用程序所需的权限来安装新的位置提供程序(android.permission.INSTALL_LOCATION_PROVIDER)。
请参见Dianne Hackborn(Android框架工程师)在此主题中的答案:
https://groups.google.com/d/topic/android-developers/OvCcdvO6jZY/discussion
要安装一个新的位置提供程序,您应该开发一个全新的固件(如http://www.cyanogenmod.com/),将您的新位置提供程序插入到该固件中,并将所有这些内容安装到用户的手机上。Pentium10提到的方法似乎已经下线了,请查看http://pedroassuncao.com/2009/11/android-location-provider-mock/
或者尝试谷歌的LocationManagerProximitryTest: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java
还有一些类似问题的解决方案/代码可以在这里找到:Android mock location on device?
阅读有关Android位置提供程序模拟的教程