维智定位 SDK 集成

维智定位 SDK 集成

最近需要做一个 SDK 定位的项目,由于 APP 需在安卓应用商店上架,高德需付费,在网上搜到一家做互联网全域定位的维智科技,他们也提供设备定位 SDK,文档、支持还比较完善,个人在集成过程中遇到一些问题,分享给大家,避免走弯路。
下载定位 SDK
1.在AndroidManifest.xml 添加相前权限

<!--外部存储读取权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<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_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<!--允许程序发现和配对蓝牙设备  -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
<uses-feature android:name="android.hardware.location.gps" />

2.添加 Service

<!-- 必选-->
<service android:name="com.wayz.location.WzService"></service>

3.先声明

MapsInitializer.updatePrivacyShow(this, true, false)
MapsInitializer.updatePrivacyAgree(this, true)

4.初始化定位模式

private WzLocationClientOption option;

private fun initLocationClient() {
    option = WzLocationClientOption()
    // 回调间隔
    option.isFastLocation = false
    option.interval = 5000
    option.isLockScreenLocation = true
    option.isUsingSensor = true
    option.locationMode = WzLocationMode.HIGHT_ACCURACY
    option.setReportHost("")
    option.setOnceLocate(false)
    client = WzLocationClient(this@BasicLocContinuousActivity, option)
}

5.实现定位监听

class BasicLocContinuousActivity : AppCompatActivity(), WzLocationListener{
override fun onLocationReceived(location: WzLocation) {
         // 成功
}

    override fun onLocationError(exception: WzException) {
// 失败
    }
}

6.整体代码

/*
 * Copyright (C) 2017 GlobalEarth, Inc. All Rights Reserved.
 */
package com.example.sample

import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.wayz.location.*
import kotlinx.android.synthetic.main.activity_main.*
import pub.devrel.easypermissions.EasyPermissions

class BasicLocActivity : AppCompatActivity(), WzLocationListener, EasyPermissions.PermissionCallbacks {
    private lateinit var client: WzLocationClient
    private lateinit var option: WzLocationClientOption
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        location_btn.setOnClickListener {
            if(checkPermisson()) {
                tv.text = "正在定位..."
                tv.visibility = View.VISIBLE
                client?.startLocation(this@BasicLocActivity)
            } else {
                tv.text = "缺少权限..."
                tv.visibility = View.VISIBLE
            }
        }
        if(checkPermisson()) {
            initLocationClient()
        }
    }

    override fun onRequestPermissionsResult(
            requestCode: Int,
            permissions: Array<out String>,
            grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
    }

    private fun checkPermisson() : Boolean {
        if (!EasyPermissions.hasPermissions(this, *MyApp.permissions)) {
            EasyPermissions.requestPermissions(this, "需要申请如下权限", 1, *MyApp.permissions)
            return false
        } else {
            return true
        }
    }

    private fun initLocationClient() {
        option = WzLocationClientOption()
        // 回调间隔
        option.interval = 5000
        option.isFastLocation = false
        option.setOnceLocate(true)
        client = WzLocationClient(this@BasicLocActivity, option)
    }

    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {
    }

    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {
        initLocationClient()
    }

    override fun onLocationReceived(location: WzLocation) {
        if (location != null) {
            val stringBuilder = StringBuilder()
                    .append("Address:")
                    .append(location.address)
                    .append("\n").append("Accuracy:")
                    .append(location.accuracy)
                    .append("\n").append("Confidence:")
                    .append(location.confidence)
                    .append("\n").append("Longitude:")
                    .append(location.longitude)
                    .append("\n").append("Latitude:")
                    .append(location.latitude)
                    .append("\n").append("Altitude:")
                    .append(location.altitude)
                    .append("\n").append("Source:")
                    .append(location.source)
                    .append("\n")
            if (location.place != null) {
                stringBuilder.append("\nPlace:")
                stringBuilder.append(location.place.name)
            }
            val nearbyPlaces = location.nearbyPlaces
            if (nearbyPlaces != null && nearbyPlaces.size > 0) {
                stringBuilder.append("\n\nNearby:")
                for (nearbyPlace in nearbyPlaces) {
                    stringBuilder.append("\n${nearbyPlace.name}")
                }
            }
            tv.text = stringBuilder.toString()
        } else {
            tv.text = "数据为空"
        }
    }

    override fun onLocationError(exception: WzException) {
        tv.text = StringBuilder().append("数据异常:").append(exception.errorMessage).toString()
    }

    override fun onDestroy() {
        client?.onDestroy()
        super.onDestroy()
    }
}

注意事项:

  1. 打包混淆,如 果 您 打 包 时 开 启 了 混 淆 建 议您在混淆规则中保留SDK在proguard-rules.pro 添加:
-keep class com.wayz.location.** {*;}
-dontwarn com.wayz.location.**
  1. 如果您的应用 targetSdkVersion >= 23,则需要在调用SDK之前申请动态权限,否则在 Android 6.0 以上手机上运行可能会崩溃。
  2. SDK 应用需要收集 WIFI 信息,如果运行在Android 6.0 以上手机上扫描 WIFI 信息需要打开 GPS 开关(位置服务选为高精度),如果您的应用不是系统应用,建议引导用户打开此开关,便于收集定位信息。
  3. 在集成过程中,如果定位失败,首先检查是否添加相关权限,以及手机定位权限是否开启,还有手机系统日期时间是否正常,定位权限
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于STM32的WiFi定位,你可以使用维智科技的物联网定位平台来实现。你可以在该平台上注册个人开发者账号,每日可以有100次请求的配额,非常适合做智能硬件的个人开发者。\[1\] 在代码中,你可以定义一个结构体来存储扫描到的WiFi信息。你可以在最前面或最后面定义一个函数来控制WiFi扫描,并将扫描到的信息赋值给结构体。例如,你可以定义一个名为wifi_scan的函数,该函数使用WiFi库的scanNetworks函数来扫描WiFi网络,并将扫描到的网络数量、MAC地址和信号强度存储在结构体中。\[2\] 为了方便,你可以在代码的前面定义该函数,但如果代码较多,将其放在后面也是一个好的选择。同时,你还需要定义一个结构体来存储WiFi信息,可以使用typedef struct来定义一个名为ap_info的结构体,该结构体包含了网络数量、MAC地址和信号强度等信息。\[3\] 通过使用维智科技的物联网定位平台和上述代码,你可以实现STM32的WiFi定位功能。 #### 引用[.reference_title] - *1* *2* *3* [Arduino ESP32 WiFi定位](https://blog.csdn.net/m0_50846041/article/details/128955571)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值