如何在Android上提供自己的LocationProvider?

时间:2010-08-03 08:01:35

标签: android

有谁知道如何提供自己的LocationProvider并将其发布到系统, 所以其他应用程序可以从LocationManager获取对它的引用吗?

4 个答案:

答案 0 :(得分:7)

出于开发和测试目的,您可以实现模拟位置提供程序。您需要在开发人员选项中启用“允许模拟位置”,以便应用程序查看该提供程序中的位置。

有关代码示例,请查看GPX播放:
https://github.com/johncarpenter/Android-GPX-Mock-Location-Provider

注册位置提供程序的代码从文件的第203行开始 android/src/com/twolinessoftware/android/PlaybackService.java

如果你想要一个“真正的”位置提供者(例如将你的功能部署为最终用户应用程序的一部分),一些消息来源说除非该提供者在使用系统密钥签名的包中,否则无法完成,所以你必须从源代码构建自己的ROM,使用密钥签名,使用相同的密钥为您的位置提供商签名,然后在手机上安装。

然而,Android在某些时候引入了“非捆绑”位置提供商。显然他们需要这样才能将他们自己的NetworkLocationProvider从Android核心移动到Google Apps包中。

我还没有看到一个非捆绑式位置提供商在实践中工作,我不知道有任何使用它的开源代码,但看起来最新版本的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系统)或者作为系统应用程序安装(可能适用于有根设备)。

有一些代码 https://github.com/microg/NetworkLocation
这似乎实现了LocationProvider。我还没有详细查看它(或者)或者构建它,所以我不能说它是否有效以及它是什么需要它。但也许它提供了一些指示。

答案 1 :(得分:1)

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?

答案 2 :(得分:1)

无法做到。

问题是只允许OEM安装新的位置提供程序。第三方开发人员无法向其应用程序授予安装新位置提供程序所需的权限(android.permission.INSTALL_LOCATION_PROVIDER)。

在这个帖子中查看Dianne Hackborn(Android框架工程师)的答案:

https://groups.google.com/d/topic/android-developers/OvCcdvO6jZY/discussion

要安装新的位置提供程序,您应该开发一个全新的固件(如http://www.cyanogenmod.com/),在此固件中插入新的位置提供程序,并在用户的手机上安装所有这些内容。

请参阅此SO主题:Why are these permissions being refused?

所有这些都是出于安全考虑。

答案 3 :(得分:0)

阅读有关Android location provider mock

的教程