小米开发平台 关于无GPS硬件机型的位置服务适配说明

小米开发平台 关于无GPS硬件机型的位置服务适配说明

1.背景

由于部分WiFi版本的小米平板(例如:小米平板5 WiFi版等)无GPS硬件,即使用户开启位置服务,应用也无法获取到GPS Provider,部分依赖于GPS位置服务的应用可能会提示“未开启位置服务或出现其他问题”,用户体验较差。

2.适配说明

针对无GPS硬件的机型,应用可以通过检测Location Proveders中是否包含”gps”来判断是否有GPS硬件。

另外,可以通过检测Network Provider状态来判断用户是否打开位置服务。

参考Demo如下:

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
// 无GPS设备通过判断Network Provider来判断位置服务是否打开
// 其他设备仍然通过GPS Provider来判断位置服务是否打开
if (!isGPSExist(lm) && isNetworkLocationAble(lm) || isGpsAble(lm)) {
    // 用户已开启位置服务
    // 应用自身定位逻辑
} else {
    // 提醒用户未开启位置服务,引导用户至位置服务设置页面
    openLocationService();
}

// 应用可以通过以下方式判断是否有GPS硬件
public static boolean isGPSExist(LocationManager lm) {
    return lm.getAllProviders().contains("gps");
}

private boolean isGpsAble(LocationManager lm){
    return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

private boolean isNetworkLocationAble(LocationManager lm){
     return lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

private void openLocationService()(){
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(intent);
}

3.优化建议

如果应用对GPS有强依赖,建议应用优化新增相关友好提示。

为什么GPS定位时间长短不一?

为什么GPS定位时间长短不一?

GPS模块一般支持冷启动(Cold start) 和热启动(Hot start) 两种模式。(注:暖启动warm-start不讨论)

一般冷启动比热启动时间要长很多,以信号足够好为例,SirFIII的热启动为15秒以内,冷启动则需要42秒以内;在信号弱的情况下则需要更长时间。

热启动条件如下:

1、上次关机前的位置信息(经纬度,高度)已知(所以在车库内关机下次就一定是冷启动了)。

2、当前时间、年历、星历已知(需要实时时钟支持) 。

3、距离上次关机时间不超过4小时(时间过长则星历变化了,即以前的卫星看不到了) 。

getCurrentPosition 仅使用 GPS 定位 APP开发定位能力 APP接入高德定位SDK

用做网页的技术做APP
一门提供标准化的jsbridge-mini.js库,您只需要在页面引用执行JS即可实现各种原生APP、原生PC的功能能力。

==================APP端==================
【APP端】(安卓版&苹果版)目前提供200+原生功能,2000+JS映射接口,用做网站的技术即可实现各种原生APP能力、APP demo地址https://www.yimenapp.com/doc/demo.cshtml下载教程:
♦ JS-SDK 引用方式:
♦ 普通网页 script 方式加载:下载最新版,请在页面上调用 jsBridge 接口之前引用 jsbridge-mini.js 库;
♦ js module 方式引用:npm install ym-jsbridge 具体请参考 npm package
一门APP开发平台通用JS

getCurrentPosition 仅使用 GPS 定位 APP开发定位能力 APP接入高德定位SDK

核心代码示例,详情参阅demo

var i = 0;
var cnt = $("#cnt").show().text("");
var result = $("#result").text("定位中...");    
$('html,body').animate({scrollTop: $('#view').offset().top}, 1200);

//需要在室外空旷处才能定位成功
jsBridge.amapLoc.getCurrentPosition({
  //仅使用 GPS 定位
  gpsOnly: true
}, function(succ, data){
  result.JSONView({
    succ: succ,
    data: data
  });
});

A标签执行JS示例代码

<a href="javascript:void(0)" onclick="zhixing()">执行</a> 
<!-- 写入一个A标签href值为"javascript:void(0)",定义点击事件onclick;-->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- 在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接;-->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
var i = 0;
var cnt = $("#cnt").show().text("");
var result = $("#result").text("定位中...");    
$('html,body').animate({scrollTop: $('#view').offset().top}, 1200);

//需要在室外空旷处才能定位成功
jsBridge.amapLoc.getCurrentPosition({
  //仅使用 GPS 定位
  gpsOnly: true
}, function(succ, data){
  result.JSONView({
    succ: succ,
    data: data
  });
});
}
</script>
<!--执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可;-->

按钮执行JS示例代码

<button onclick="zhixing()" >执行</button>
<!-- //写一个按钮,定义点击执行事件; -->
<script src="您的服务器URL/jsbridge-mini.js"></script>
<!-- //在您的服务器引入一门JS地址,请下载jsbridge-mini.js上传您自己的服务器获取链接; -->
<script type="text/javascript">
function zhixing() {


<!--这里可以直接复制JS核心代码到此{}括号内-->
var i = 0;
var cnt = $("#cnt").show().text("");
var result = $("#result").text("定位中...");    
$('html,body').animate({scrollTop: $('#view').offset().top}, 1200);

//需要在室外空旷处才能定位成功
jsBridge.amapLoc.getCurrentPosition({
  //仅使用 GPS 定位
  gpsOnly: true
}, function(succ, data){
  result.JSONView({
    succ: succ,
    data: data
  });
});

}
</script>
<!-- //执行核心代码;
//如果需要进入页面就执行,去掉点击事件即可; -->