如何在 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 将其移动到系统应用文件夹),并且至少需要一个后端,可以是用户空间应用。跨度> 谢谢!虽然这个库似乎不见了: github.com/android/platform_frameworks_base/tree/master/… 我在哪里可以找到它?我真的需要查看整个仓库吗? 显然 UnifiedNLP 旨在使用 Android 构建系统构建。这是构建作为 ROM 映像一部分的组件的标准方法,但也可以仅构建单个组件(请参阅 Github 存储库主页上的构建说明)。您可能不需要克隆整个 AOSP 源代码树,只需克隆其中的相关部分即可。你提到的那个看起来是一个好的开始。您可能需要查看 Android 构建说明(例如 CyanogenMod 的构建说明)以了解如何在本地设置代码树。 我得到:05-12 11:28:22.287 1420-1525/system_process W/LocationManagerService:se.xxx.android.gpsprovider 实现了 com.android.location.service.NetworkLocationProvider 但它的签名没有t 匹配@0 中的那些,忽略。知道这意味着什么吗? @0 是什么?【参考方案2】:

这是不可能的。

问题是只有 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何移植android2.1源代码到自己的手机上

如何将Android的AOSP仓库放置到自己的gitlab服务器上?

android: 创建自己的内容提供器

如何在Android Studio中使用Maven

android上如何使用sqlite数据库

如何在 Android 上测试内容提供者