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

11

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


1
这个问题有没有令人满意的答案????? - sneaker_android
4个回答

12

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

要查看代码示例,请参阅 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上有一些代码似乎实现了一个位置提供程序。我还没有仔细研究它或构建它,因此我无法说它是否可行以及需要什么。但也许它能提供一些指导。


如果我自己制作了一个LocationProvider,我要如何注册/安装它呢?我在清单文件中找不到任何相关信息... - JohnyTex
1
我个人从未尝试过,但是 https://github.com/microg/android_packages_apps_UnifiedNlp 上有一个自定义的位置提供程序。该应用程序应具备安装适当位置提供程序所需的所有代码。如果您想尝试该应用程序,则需要将其安装为系统应用程序(只需通过终端或adb安装并将其移动到系统应用程序文件夹中),并且至少需要一个后端,可以是用户空间应用程序。 - user149408
谢谢!虽然这个库似乎缺少: <uses-library android:name="com.android.location.provider" />https://github.com/android/platform_frameworks_base/tree/master/location/lib 我在哪里可以找到它?我真的需要检出整个存储库吗? - JohnyTex
2
显然,UnifiedNLP旨在使用Android构建系统构建。这是构建ROM镜像的组件的标准方式,但也可以仅构建单个组件(请参阅Github存储库主页上的构建说明)。您可能不需要克隆整个AOSP源代码树,而只需克隆其中相关部分。您提到的那个看起来是一个很好的开始。您可能需要查看Android构建说明(例如CyanogenMod的构建说明),以了解如何在本地设置代码树。 - user149408
我得到了这个:05-12 11:28:22.287 1420-1525/system_process W/LocationManagerService﹕ se.xxx.android.gpsprovider实现了com.android.location.service.NetworkLocationProvider,但它的签名与@0中的不匹配,因此被忽略。你知道这是什么意思吗?@0是什么? - JohnyTex
我猜这意味着系统希望位置提供者与系统使用相同的密钥进行签名。我认为这在Android中并不是标准做法 - 你用的是什么ROM?如果你的设备支持Cyanogenmod,可以试试看。 - user149408

4

这是不可能的。

问题在于只有原始设备制造商才被允许安装新的位置提供程序。第三方开发者无法授予他/她的应用程序所需的权限来安装新的位置提供程序(android.permission.INSTALL_LOCATION_PROVIDER)。

请参见Dianne Hackborn(Android框架工程师)在此主题中的答案:

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

要安装一个新的位置提供程序,您应该开发一个全新的固件(如http://www.cyanogenmod.com/),将您的新位置提供程序插入到该固件中,并将所有这些内容安装到用户的手机上。
另请参阅此SO线程:为什么会拒绝这些权限? 所有这些都是出于安全方面的考虑。

在已经获取了 root 权限的设备上,这是否可行? - JohnyTex
1
@JohnyTex 是的,在已经获取了 root 权限的设备(或自定义 ROM)上是可以实现的。请查看 https://github.com/microg/android_packages_apps_UnifiedNlp 上的说明。 - Matija Nalis

1

0

我不打算为自己的应用程序提供虚拟位置数据,而是为手机上所有其他应用程序提供一个额外的位置提供者以供选择。 - Marcus Wolschon
因此,“Android位置提供程序模拟器”的教程并不实用。 - Marcus Wolschon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接