Skip to content

Demonstrates retrieving location updates ( Baidu / AMap / Google ) in the background.

Notifications You must be signed in to change notification settings

kuloud/HiveLocation

Repository files navigation

License API jekyll-gh-pages

HiveLocation 后台持续定位 (Kotlin)

包装高德、百度、谷歌的定位模块,按照 Google 官方定位样例工程 android/location-samples ,将定位回调数据持久化保存。 可以方便的利用 ViewModel 绑定 LiveData,也可以直接数据查询。

功能特性

  • 支持定位SDK

    • Baidu(v9.4.0)
    • AMap(v6.3.0)
    • Google(v19.0.1)
  • 定位数据持久化

  • 定位点数据 LiveData 监听

前置要求

  • Android API Level > v21

开始使用

mavenCentral()

// 或者 GPR
maven {
    url 'https://maven.pkg.github.com/kuloud/HiveLocation'
    credentials {
        username = properties.getProperty("gpr.user") ?: System.getenv("GPR_USER")
        password = properties.getProperty("gpr.key") ?: System.getenv("GPR_API_KEY")
    }
}

Baidu

build.gradle 中添加组件依赖:

dependencies {
    implementation "io.github.kuloud:location-common:0.0.1"
    implementation "io.github.kuloud:location-baidu:0.0.1"
}

在应用的 Manifest 文件中神明应用权限:

<!-- 这个权限用于进行网络定位-->
<uses-permission
    android:name="android.permission.ACCESS_COARSE_LOCATION" /><!-- 这个权限用于访问系统接口提供的卫星定位信息-->
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE" /><!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission
android:name="android.permission.CHANGE_WIFI_STATE" /><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Manifest 或者 local.properties 中配置 SDK 的 AppKey, 在 application 标签中添加 SDK Service 声明:

<!-- Baidu BEGIN -->
<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="${BD_MAP_AK}" />

<service
    android:name="com.baidu.location.f"
    android:enabled="true"
    android:process=":remote" />
<!-- Baidu END -->

给 HiveLocation 设置 Backend 实例:

HiveLocation.setAgreePrivacy(true)
HiveLocation.setBackend(
  requireContext(),
  BaiduLocationBackend(requireContext().applicationContext)
)

AMap

build.gradle 中添加组件依赖:

dependencies {
    implementation "io.github.kuloud:location-common:0.0.1"
    implementation "io.github.kuloud:location-amap:0.0.1"
}

在应用的 Manifest 文件中神明应用权限:

<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET" /><!--允许获取精确位置,精准定位必选-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!--允许获取粗略位置,粗略定位必选-->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" /><!--允许获取设备和运营商信息,用于问题排查和网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission
android:name="android.permission.READ_PHONE_STATE" /><!--允许获取网络状态,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" /><!--允许获取wifi网络信息,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE" /><!--允许获取wifi状态改变,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!--后台获取位置信息,若需后台定位则必选-->
<uses-permission
android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /><!--用于申请调用A-GPS模块,卫星定位加速-->
<uses-permission
android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><!--允许写设备缓存,用于问题排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" /><!--允许写入扩展存储,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--允许读设备等信息,用于问题排查-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

Manifest 或者 local.properties 中配置 SDK 的 AppKey, 在 application 标签中添加 SDK Service 声明:

<!-- AMap BEGIN -->
<meta-data
    android:name="com.amap.api.v2.apikey"
    android:value="${AMAP_AK}" />

<service android:name="com.amap.api.location.APSService" />
<!-- AMap END -->

给 HiveLocation 设置 Backend 实例:

HiveLocation.setAgreePrivacy(true)
HiveLocation.setBackend(requireContext(), AMapLocationBackend(requireContext()))

Google

本项目思路来源于 Google 官方的 demo,功能未做实现和验证,可直接参考原项目: https://github.com/android/location-samples

使用方法

Use LocationUpdateViewModel to handle with location updates in foreground:

class LocationUpdateFragment : Fragment() {

    private val locationUpdateViewModel by lazy {
        ViewModelProvider(this)[LocationUpdateViewModel::class.java]
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        locationUpdateViewModel.receivingLocationUpdates.observe(
            viewLifecycleOwner
        ) { receivingLocation ->
            // handle with receivingLocation
        }

        locationUpdateViewModel.locationListLiveData.observe(
            viewLifecycleOwner
        ) { locations ->
            // handle with history locations
        }
        
        // trigger location start / end
        locationUpdateViewModel.startLocationUpdates()
        locationUpdateViewModel.stopLocationUpdates()
    }

}

帮助支持

如果您发现这个示例中有错误,请提交 issue 到以下链接:https://github.com/kuloud/HiveLocation/issues

版权说明

Copyright 2023 kuloud (kuloud@outlook.com)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Demonstrates retrieving location updates ( Baidu / AMap / Google ) in the background.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Languages