如何在 Android 上提供自己的 LocationProvider?
Posted
技术标签:
【中文标题】如何在 Android 上提供自己的 LocationProvider?【英文标题】:How to provide your own LocationProvider on Android? 【发布时间】:2011-03-24 14:30:00 【问题描述】:有谁知道如何提供自己的 LocationProvider 并将其发布到系统, 所以其他应用可能会从 LocationManager 中获取对它的引用?
【问题讨论】:
这个问题有满意的答案吗?????? 【参考方案1】:出于开发和测试目的,您可以实现一个模拟位置提供程序。您需要在开发人员选项中启用“允许模拟位置”,以便应用程序查看来自该提供商的位置。
有关代码示例,请查看 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。我还没有(还)详细查看它或构建它,所以我不能说它是否有效以及它需要什么。但也许它提供了一些指针。
【讨论】:
如果我自己制作LocationProvider,如何注册/安装它?我在清单中找不到任何东西... 我自己从未这样做过,但github.com/microg/android_packages_apps_UnifiedNlp 有一个自定义位置提供程序。此应用程序应具有安装正确位置提供程序的所有代码。如果您想试用该应用,则需要将其安装为系统应用(只需将其安装并通过终端或 adb 将其移动到系统应用文件夹),并且至少需要一个后端,可以是用户空间应用。跨度> 谢谢!虽然这个库似乎不见了:这是不可能的。
问题是只有 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?
所有这些都是出于安全考虑。
【讨论】:
有根设备可以吗? @JohnyTex 是的,它可以在有根设备(或自定义 rom)上。请参阅github.com/microg/android_packages_apps_UnifiedNlp 处的说明【参考方案3】:Pentium10提示的好像下线了,看看http://pedroassuncao.com/2009/11/android-location-provider-mock/
或 google 的 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?
【讨论】:
【参考方案4】:阅读有关Android location provider mock的教程
【讨论】:
我不打算为我自己的应用程序提供模拟位置数据,而是为手机上的所有其他应用程序提供一个额外的 LocationProvider 可供选择。 因此关于“Android location provider mock”的教程没有帮助。以上是关于如何在 Android 上提供自己的 LocationProvider?的主要内容,如果未能解决你的问题,请参考以下文章