文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android GPS室内定位问题的解决方法(location为null)

2022-06-06 04:18

关注

为什么室内没有location呢?

       因为我们开发的时候几乎肯定都是在室内的,这个时候卫星你是搜索不到的,所以必然是定位不了的,所以系统如何将位置信息通知给你的程序。所以要从根本上解决这个问题,就要解决位置信息获取问题。
        那么我来告诉大家,只有NETWORK_PROVIDER这种模式才是室内定位可靠的方式,就是当location为null的时候只要用这个,NETWORK_PROVIDER。
        不过直接用大家也是用不了的,为啥呢,因为大部分厂商也不会用google的服务,这种定位方式默认是没法用的。那怎么办?好办,找个替代的服务商就可以了,百度或者高德的位置信息sdk就可以解决这个问题。它的基本原理在上面已经提到过了,就是搜集你的wifi节点信息和你的手机基站信息来定位。 

        本篇文章我们来用百度解决。

用百度位置定位SDK

SDK下载:http://lbsyun.baidu.com/sdk/download
SDK使用:

1.  申请百度的服务密钥,具体操作步骤见官网:http://api.map.baidu.com/lbsapi/cloud/geosdk.htm
2.将上面下载的sdk文件locSDK_4.1.jar拷贝到你项目的libs下
3.  修改AndroidManifest文件,在该文件里添加如下配置       


<service
 android:name="com.baidu.location.f"
 android:enabled="true"
 android:process=":remote" >
</service>
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="xxxxx " />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

上面meta-data中value的值改为你自己的密钥

  代码里调用sdk:


public class LocationUtil {
 private final static boolean DEBUG = true;
 private final static String TAG = "LocationUtil";
 private static LocationUtil mInstance;
 private BDLocation mLocation = null;
 private MLocation mBaseLocation = new MLocation();
 public static LocationUtil getInstance(Context context) {
 if (mInstance == null) {
 mInstance = new LocationUtil(context);
 }
 return mInstance;
 }
 Context mContext;
 String mProvider;
 public BDLocationListener myListener = new MyLocationListener();
 private LocationClient mLocationClient;
 public LocationUtil(Context context) {
 mLocationClient = new LocationClient(context.getApplicationContext());
 initParams();
 mLocationClient.registerLocationListener(myListener);
 }
 public void startMonitor() {
 if (DEBUG) Log.d(TAG, "start monitor location");
 if (!mLocationClient.isStarted()) {
 mLocationClient.start();
 }
 if (mLocationClient != null && mLocationClient.isStarted()) {
 mLocationClient.requestLocation();
 } else {
 Log.d("LocSDK3", "locClient is null or not started");
 }
 }
 public void stopMonitor() {
 if (DEBUG) Log.d(TAG, "stop monitor location");
 if (mLocationClient != null && mLocationClient.isStarted()) {
 mLocationClient.stop();
 }
 }
 public BDLocation getLocation() {
 if (DEBUG) Log.d(TAG, "get location");
 return mLocation;
 }
 public MLocation getBaseLocation() {
 if (DEBUG) Log.d(TAG, "get location");
 return mBaseLocation;
 }
 private void initParams() {
 LocationClientOption option = new LocationClientOption();
 option.setOpenGps(true);
 //option.setPriority(LocationClientOption.NetWorkFirst);
 option.setAddrType("all");//返回的定位结果包含地址信息
 option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
 option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
 option.disableCache(true);//禁止启用缓存定位
 option.setPoiNumber(5); //最多返回POI个数 
 option.setPoiDistance(1000); //poi查询距离 
 option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息 
 mLocationClient.setLocOption(option);
 }
 public class MyLocationListener implements BDLocationListener {
 @Override
 public void onReceiveLocation(BDLocation location) {
 if (location == null) {
 return ;
 }
 mLocation = location;
 mBaseLocation.latitude = mLocation.getLatitude();
 mBaseLocation.longitude = mLocation.getLongitude();
 StringBuffer sb = new StringBuffer(256);
 sb.append("time : ");
 sb.append(location.getTime());
 sb.append("\nerror code : ");
 sb.append(location.getLocType());
 sb.append("\nlatitude : ");
 sb.append(location.getLatitude());
 sb.append("\nlontitude : ");
 sb.append(location.getLongitude());
 sb.append("\nradius : ");
 sb.append(location.getRadius());
 sb.append("\ncity : ");
 sb.append(location.getCity());
 if (location.getLocType() == BDLocation.TypeGpsLocation){
 sb.append("\nspeed : ");
 sb.append(location.getSpeed());
 sb.append("\nsatellite : ");
 sb.append(location.getSatelliteNumber());
 } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
 sb.append("\naddr : ");
 sb.append(location.getAddrStr());
 }
 if (DEBUG) Log.d(TAG, "" + sb);
 }
 public void onReceivePoi(BDLocation poiLocation) {
 }
 }
 public class MLocation {
 public double latitude;
 public double longitude;
 }
}

当然别忘了在setting里将gps定位打开。

您可能感兴趣的文章:Android打开GPS导航并获取位置信息返回null解决方案Android GPS定位测试(附效果图和示例)Android实现GPS定位代码实例android通过gps获取定位的位置数据和gps经纬度 android手机获取gps和基站的经纬度地址实现代码Android中GPS定位的用法实例Android实现Service获取当前位置(GPS+基站)的方法Android中实现GPS定位的简单例子在Android模拟器上模拟GPS功能总是null的解决方法Android使用GPS获取用户地理位置并监听位置变化的方法


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯