Android Studio高德地图和百度地图获取位置

Android Studio高德地图和百度地图获取位置
----吐槽
这几天想给自己项目加个定位系统好获取位置。结果被弄得欲仙欲死。
先是弄了系统原生的定位,只能获取经纬度,虽然获取经纬度后利用这个:
http://api.map.baidu.com/geocoder?output=json&location=23.139,113.024893&ak=esNPFDwwsXWtsQfw4NMNmur1
Android Studio高德地图和百度地图获取位置
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
建议像我一样不是很会的,就一股脑的把需要都点了,因为代码有些用到的包如果没下会很麻烦,虽然用多少下多少比较好,但是新手还是全下吧
Android Studio高德地图和百度地图获取位置
先看这个文章,如果不懂再去下面几篇文章查
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导入后变成这样
Android Studio高德地图和百度地图获取位置
代码什么的看这里

这个才是重点,代码+配置下面也有

https://blog.****.net/code_better/article/details/54936115

补充一下,之前说过下载sdk最好都下,每个sdk下了东西都不同,有些需要important的,有些jar包里没有,所以这就很坑了,比如这个search,所以建议小伙伴们还是能下的都下,不然可能木有search这个包!
Android Studio高德地图和百度地图获取位置

-------------------------高德地图--------------------

最后讲的是高德地图,不得不说,高德地图比百度地图好用(可能百度地图坑踩了太多了),有了之前配置百度地图的经验。
还是得先看高德地图那里的文档说明,了解下怎么配置
https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project
key申请好,文件配置好,代码弄好就能运行了
效果图:(会Toast位置信息的,没截到而已= =)
Android Studio高德地图和百度地图获取位置
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的包没更新?
Android Studio高德地图和百度地图获取位置
最后就是
Android Studio高德地图和百度地图获取位置
祝大家学习愉快。哈哈哈~~