Android Studio高德地图和百度地图获取位置
Android Studio高德地图和百度地图获取位置
----吐槽
这几天想给自己项目加个定位系统好获取位置。结果被弄得欲仙欲死。
先是弄了系统原生的定位,只能获取经纬度,虽然获取经纬度后利用这个:
http://api.map.baidu.com/geocoder?output=json&location=23.139,113.024893&ak=esNPFDwwsXWtsQfw4NMNmur1
json数据转换可以直接获取信息,不过还是比较麻烦。(不推荐)所以不说原生获取位置,下面讲百度地图和高德地图
-------------------------百度地图-----------------------
然后就跑去用了百度地图,申请key,获取SHAI,下载SDK包…叭拉叭拉一堆之后,发现定位坐标是null,显示4.9E-324(即定位不到)弄了2天,不是so文件也不是sdk,也不是androidmanifest的问题,最后弄了半天发现不能用模拟器定位(并不是说网上说的什么版本22以上就得动态赋予权限什么的,有在androidManifest那里给权限就行了),用真机运行有时定位得到,有时还不行,可能网络问题。(所以不是很推荐百度地图)
如果想用百度地图的朋友,这是我几天看的文章弄的
首先是百度sdk下载:
http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=mapsdk_basicmap,mapsdk_searchfunction,mapsdk_lbscloudsearch,mapsdk_calculationtool,mapsdk_radar
建议像我一样不是很会的,就一股脑的把需要都点了,因为代码有些用到的包如果没下会很麻烦,虽然用多少下多少比较好,但是新手还是全下吧
先看这个文章,如果不懂再去下面几篇文章查
http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/key
下载好包之后还要申请key(一个key不要多用)
https://jingyan.baidu.com/article/e73e26c0b5b75124adb6a786.html
申请key的时候会发现他要你SHA1
https://www.jianshu.com/p/86d0546d53f6
(注意发布版SHA1和开发版SHA1不一样,发布版需要用到)
到这里就配置成功了…把下载的sdk导入后变成这样
代码什么的看这里
这个才是重点,代码+配置下面也有
https://blog.****.net/code_better/article/details/54936115
补充一下,之前说过下载sdk最好都下,每个sdk下了东西都不同,有些需要important的,有些jar包里没有,所以这就很坑了,比如这个search,所以建议小伙伴们还是能下的都下,不然可能木有search这个包!
-------------------------高德地图--------------------
最后讲的是高德地图,不得不说,高德地图比百度地图好用(可能百度地图坑踩了太多了),有了之前配置百度地图的经验。
还是得先看高德地图那里的文档说明,了解下怎么配置
https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project
key申请好,文件配置好,代码弄好就能运行了
效果图:(会Toast位置信息的,没截到而已= =)
https://blog.****.net/zszszszzs/article/details/80918023?utm_source=blogxgwz1
https://blog.****.net/zss1973/article/details/50298981
这2篇是看的高德地图定位的文章
代码就很简单了MainActivity
import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
public class MainActivity extends AppCompatActivity implements LocationSource,AMapLocationListener {
private MapView mMapView;//显示地图的视图
private AMap aMap;//定义AMap 地图对象的操作方法与接口。
private OnLocationChangedListener mListener;//位置发生变化时的监听
private AMapLocationClient mapLocationClient;//定位服务类。此类提供单次定位、持续定位、地理围栏、最后位置相关功能。
private AMapLocationClientOption mapLocationClientOption;//定位参数设置,通过这个类可以对定位的相关参数进行设置
//在AMapLocationClient进行定位时需要这些参数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMapView = findViewById(R.id.mapview);
mMapView.onCreate(savedInstanceState);//必须调用
init();
}
//实例化Amap对象
public void init() {
if (aMap == null) {
aMap = mMapView.getMap();
setConfigrationAmap();
}
}
//配置Amap对象
public void setConfigrationAmap() {
aMap.setLocationSource(MainActivity.this);//设置定位监听
aMap.setMyLocationEnabled(true);//设置显示定位层,并可以出发定位
aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置显示定位按 钮
aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);//设置定位类型
}
// 必须重写
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
mMapView.onSaveInstanceState(outState);
}
// 必须重写
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
// 必须重写
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
deactivate();
}
// 必须重写
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
if(mapLocationClient!=null){
mapLocationClient.onDestroy();
}
}
//**定位
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) { System.out.println("已经**定位-------------activate");
mListener=onLocationChangedListener;
if(mapLocationClient==null){
mapLocationClient=new AMapLocationClient(MainActivity.this);
mapLocationClientOption=new AMapLocationClientOption();
mapLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位模式为 高精度
mapLocationClient.setLocationOption(mapLocationClientOption);//设置配置
mapLocationClient.setLocationListener(this);//设置位置变化监听
mapLocationClient.startLocation();
}
}
//关闭定位
@Override
public void deactivate() {
mListener=null;
if(mapLocationClient!=null){
mapLocationClient.stopLocation();
mapLocationClient.onDestroy();
}
mapLocationClient =null;
System.out.println("已经关闭定位-------------deactivate");
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if(mListener!=null&&aMapLocation!=null){
if(aMapLocation!=null&&aMapLocation.getErrorCode()==0){
Toast.makeText(MainActivity.this,aMapLocation.getAddress(),Toast.LENGTH_SHORT).show();
mListener.onLocationChanged(aMapLocation);
System.out.println(aMapLocation.getLatitude() + "----" + aMapLocation.getLongitude() + "---------" + aMapLocation.getErrorCode());
}
}else{
Toast.makeText(MainActivity.this,"定位失败:"+aMapLocation.getErrorCode(),Toast.LENGTH_SHORT).show();
}
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.amap.api.maps.MapView
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.amap.api.maps.MapView>
</RelativeLayout>
最后说一下,如果出现白屏、蓝屏、黑屏。(别问我怎么知道,因为我把所有能遇见的坑都踩了TUT)
那么请检查下.so和androidMani还有app.group是否有错,还有复制到main新建的jniLibs,注意复制过去的包是否为空,有时候你直接复制过去,可能那些文件夹只有名字,没有数据显示0KB,这点要小心!
还有就是定位要用手机运行,别用模拟器,模拟器可能运行不了,我感觉是x86的包没更新?
最后就是
祝大家学习愉快。哈哈哈~~