经纬度持续变化,数据来源GPS,解决经纬度出现4.9E-324的问题
- 全部代码
- 实验效果及更改说明
- 本项目遇到的问题(经纬度出现4.9E-324)及解决方法
- 《第一行代码》书籍分享如下:
-
- 一点解释
- 心路历程
全部代码
MainActivity.java
package com.example;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;import java.util.ArrayList;
import java.util.List;import static com.baidu.lbsapi.auth.LBSAuthManager.VERSION;public class MainActivity extends AppCompatActivity {private MapView mapView;private TextView positionText;public LocationClient mLocationClient;private BaiduMap baiduMap;private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mLocationClient = new LocationClient(getApplicationContext());Log.i(TAG, "onReceiveLocation: LocationListener 1 print!!!");//程序运行到了这里 ·1mLocationClient.registerLocationListener(new MyLocationListener());//监听回调Log.i(TAG, "onReceiveLocation: LocationListener 2 print!!!");//程序运行到了这里 ·1setContentView(R.layout.activity_main);positionText = (TextView) findViewById(R.id.position_text_view);Log.i(TAG, "onReceiveLocation: onCreate print!!!");//程序运行到了这里 ·1//将三种请求权限先放至list在放入StringList<String> permissionList = new ArrayList<>();if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.READ_PHONE_STATE);}if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);}if (!permissionList.isEmpty()) {String[] permissions = permissionList.toArray(new String[permissionList.size()]);ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);//为三种权限实现一次性申请} else {Log.i(TAG, "onReceiveLocation: permissionRquest print!!!");//程序运行到了这里 ·2requestLocation();//当权限全部被同意之后才会开始地理位置的定位}}private void requestLocation() {initLocation();mLocationClient.start();//结果会回调到之前的监听器当中即MyLocationListener,start的工作原理是什么,什么时候开始start?Log.i(TAG, "onReceiveLocation: mLocationClient print!!!");//程序运行到了这里 ·4}private void initLocation() {LocationClientOption option = new LocationClientOption();option.setCoorType("bd09ll");//默认值是gcj02,中国坐标偏移标准,google map,高德、腾讯使用option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//设置传感器类型,其实也就是GPS定位option.setOpenGps(true); // 允许gps定位option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
// option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果option.setScanSpan(1000);//每8秒更新位置mLocationClient.setLocOption(option);Log.i(TAG, "onReceiveLocation: initLocation print!!!");//程序运行到了这里 ·3}@Overrideprotected void onDestroy() {Log.i(TAG, "onReceiveLocation: onDestroy print!!!");super.onDestroy();mLocationClient.stop();}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0) {for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "必须同意所有权限才能使用本程序",Toast.LENGTH_SHORT).show();finish();return;}}requestLocation();} else {Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();finish();}break;default:}}public class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {Log.i(TAG, "onReceiveLocation: MyLocationListener print!!!");StringBuilder currentPosition = new StringBuilder();currentPosition.append("经度:").append(location.getLongitude()).append("\n");currentPosition.append("纬度:").append(location.getLatitude()).append("\n");currentPosition.append("国家:").append(location.getCountry()).append("\n");currentPosition.append("省份:").append(location.getProvince()).append("\n");currentPosition.append("市:").append(location.getCity()).append("\n");currentPosition.append("区:").append(location.getDistrict()).append("\n");currentPosition.append("街道:").append(location.getStreet()).append("\n");currentPosition.append("定位方式:");if(location.getLocType() == BDLocation.TypeGpsLocation){currentPosition.append("GPS");}else if(location.getLocType() == BDLocation.TypeNetWorkLocation){currentPosition.append("NetWork");}positionText.setText(currentPosition);}}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example"><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.WAKE_LOCK" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="GwZepuD4owFzGnoAsuAkj1bpt4NFPSWw" /><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"></service></application></manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/position_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
实验效果及更改说明
- 没传视频到这,口述效果
- 定位方式为GPS:手机正中间的经纬度会随着你的移动,每秒都会发生变化(前提是你没有连接网络,并且你在室外,如果你在室内的话,是无法看到经纬度变化的,甚至打开软件发现啥都没有,这就是你在室内,gps信号进不来。)
- 定位方式为NetWork:你已连接网络并且现在的定位方式是网络定位,经实测,网络定位不够及时,比较慢,个人推测可能跟你手机的网速有关系,如果手机被限速的话,可能影响会比较大。
- 如何更改手机的定位方式:
在MainActivity当中,方法initLocation()当中, option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);//设置传感器类型,其实也就是GPS定位
该行代码指定 定位方式为gps,优先选择gps,如果你已连接网络,那么在没有gps信号的时候会采取NetWork的定位方式,需要注意。如果自己不想使用NetWork的定位方式,让手机保持无网络的状态并且身处室外即可达到实验效果。
本项目遇到的问题(经纬度出现4.9E-324)及解决方法
我在改bug时,在网络搜索这个问题,会出现很多种可能,可能的错误原因如下几种:
- 情况一: libs里面缺少armeabi-v7a文件夹
- 情况二:网络不好,联网失败之类的,导致了定位没有成功,换到环境开阔的地方问题解决。
- 情况三:定位需要的一些权限没有配齐,在manifest清淡文件中补齐后问题解决。
- 情况四:key不对,开发的时候用的key是发布的key,导致了这个错误,将key换过来后问题解决。
- 以上情况参考以下CSDN:
点击即可
这里要讲的是另外一种可能情况如下
- 问题介绍:
我找了很多种情况,结果都不符合自己的情况,然后我又去运行了一下自己的百度地图引入的代码,发现出错,并提示错误代码
error code101 无法在AndroidManifest.xml中获取com.baidu.android.lbs.API_KEY的值 - 在网上搜索后发现,是AndroidManifest.xml文件的问题,然后在API_KEY的地方我发现了问题如下:
-
<meta-dataandroid:name="com.baidu.mapapi.API_KEY"android:value="GwZepuD4owFzGnoAsuAkj1bpt4NFPSWw"/>
乍一看其实没问题,但问题就在于格式错误,应该是如下:
-
<meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="GwZepuD4owFzGnoAsuAkj1bpt4NFPSWw"/>
没错,就是mapapi以及lbsapi的差别。就是这样的一个问题让我纠结了很多天,总是想不清楚为什么自己的经纬度刚开始可以定位准确后来就出差错了,我反复与《第一行代码》当中的代码作对比,没找出来错误,没有想到问题居然发生在了这个不起眼的小地方。
当然,还有的错误情况 把KEY写成了Key,等等诸如此类的小失误都会导致你的经纬度返回4.9E-324
- 那为什么经纬度返回的都是4.9E-324而不是别的值呢,因为百度地图官方将经纬度的初始值默认为这个,当你的so出错时,当你的经纬度无法回调时,当你无法获取到正确的经纬度的时候都会返回这个值,所以,要根据自己的实际情况,根据你的log当中的error的代码去查看自己是那种错误然后对症下药,才可以解决自己的病症。
《第一行代码》书籍分享如下:
链接:https://pan.baidu.com/s/1Ewor7EiRaWZzj-IFuC3TgA
提取码:thrk
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V4的分享
一点解释
本文的代码是照搬这本书籍的,个人经过学习之后觉得对于Android Studio的开发人员来讲,这是一本疯狂讲义对于Java一般重要性的书籍,墙裂推荐大家系统地学习此书再来开发。
心路历程
- 为了准备4.20的中期答辩,我着急赶进度,却没有停下脚步来修改自己曾经在这里遇到的问题,导致即使我能够将百度地图引入,能够显示自己的图标,但总是无法在地图上显示图标的变化,毕设陷入死水,没有一点动静儿,自己心里干着急。
- 开发及比赛经验极少的我,在大学时光面对老师所布置的开发大作业任务的时候总是习惯性的躲在组长身后,让组长一个人带飞,但自己实际上什么也没学,这件事情一直是我的一个遗憾,虽然身为计算机专业的学生但是却一点不懂计算机专业的知识,比如数据结构,比如算法。
- 在面对毕业设计时,我能明显的感到自己的底气不足,你想啊,同届的同学们这四年打了多少比赛,做了多少项目啊,他们积攒了那么多的经验,现在来准备这个毕业设计岂不是如鱼得水,我怎么能够跟他们比速度和质量么,诸如此类的想法困扰了我许久,一度有点怀疑自己当初做的决定是否有点傻,早知道这样我当初是不是应该像别的同学一样买一个毕业设计不用自己花时间和精力?
- 在去年考研的时候,我也没有好好学,基础很弱,到了12月份,虽然没有像刘晓艳老师之前在中北讲座所说的生不如死那么夸张,但我知道,我看似非常平静的神态下一直隐藏着自己的自卑与胆小。但即使考研全败,我仍然做到了早上起来占座,我也做到了即使题目不会就算是坐着我在考场坚定地坐到考试结束。因为,我从来都不是一个放弃的人,学习习惯不好是我的问题,大学没在专业能力下功夫也是自己选择错误,不知道专业能力对于一个大学生而言的重要性。但我从来都不会逃避,我会咬着牙直面即将到来的任何风雨。
- 把自己的心态稳下来之后,我开始思考,为什么别人就可以有思路把bug解决掉,或者说他们怎么就知道如何去开发一个程序呢,都是爹妈生的,难道他们多个脑子?想到这里,我开始在网上搜索编码之前应该知晓的基础知识。例如,想要开发一个程序,应该分哪些步骤去进行?当你遇到一个bug,应该如何搜索,如何描述bug?如何用自己的方法把这个问题进行切割划分成几个小问题然后逐个击破。
- 我坚信这个世界没有解决不了的难题,如果有,只能证明苦没下到,方法还不正确。抱着这个心态,我有重新打开了本文所讲的这个module,我开始去了解java代码的执行顺序,开始使用《第一行代码》所讲的输出logi方法查看方法是否被调用,以及调用的顺序。将100多行代码分块检查,最终全部检查之后,虽然没有直接找到问题,但是自己对代码的熟悉度得到了一个极大的提升。
- 我特别赞成唐静老师曾说过的一句话,“没步路都算数”。虽然觉得自己有点无头苍蝇的感觉,但始终坚持下来,终于在百度地图的那个项目我找到了错误原来是lbsapi,我写成了mapapi,更改之后,一切问题迎刃而解。但最重要的是,我对代码的熟悉度有一个质的飞跃并且因为这次经历,给自己积攒了一定的代码经验,知道了该如何去描述bug,如何寻找bug出现的位置,以及如何尝试解决bug。
- 编写代码是有难度的,但同时也是具有魅力的,看着生硬的字母在电脑的成功运行下呈现诸多不一样的效果,有点酒不醉人人自醉的韵味。
- 代码还在继续,故事也未结束,期待毕设完工的那天!
- 这次的项目分享到这里就结束了,如果对您有帮助不妨点个赞谢谢!