Android集成高德地图定位功能

要集成第三方SDK,不外乎几点。1、在该第三方的API开发平台注册账号创建应用得到key,2、导包到项目中,3、配置好环境就可以“为所欲为”啦。

第一步,注册开发者账号,创建应用获取key
这里写图片描述
key名称随便填
SHA1码就是你正式版APK的.keystore或者.jks解析出来的,方法如下:打开cmd,进入到jdk下的bin目录,输入命令 keytool -list -v -keystore 你的keystore目录 输入密码按enter,(ps:密码输入是不显示出来的)即可获取该值
这里写图片描述
然后你就可以在开发平台的控制台看到你的key了

第二步,导包

这里前往下载,下载完之后解压,可以看到有一个demo,打开文件夹,拷贝目录lib下的所有文件到你的项目中,重新编译项目即可。

第三步,配置环境

  1. AndroidManifest.xml
 <service android:name="com.amap.api.location.APSService" />
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="ea000bbc09e751321e64d1e52ac6c677"
            tools:replace="android:value"/>
            还有相关权限,自行配置。。。

2.build.gradle

 ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    signingConfigs {
        release {
            storeFile file('.keystore或.jks的路径')
            storePassword '密码'
            keyAlias '别名'
            keyPassword '密码'
        }
    }
    如果不添加这个配置,则无法定位,会报权限信息错误,即开发文档的 **错误7**
   buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            signingConfig signingConfigs.release
        }
    }

最后看代码,MainActivity


/**
 * 用户服务协议
 */
public class LocationActivity extends BaseActivity implements AMapLocationListener {
    private static final String TAG = "LocationActivity ";
    //声明AMapLocationClient类对象
    public AMapLocationClientOption mLocationOption = null;
    private AMapLocationClient mlocationClient;
    private TextView tv_location;

    @Override
    public View getContentView() {
        return LayoutInflater.from(this).inflate(R.layout.activity_location, null);
    }

    @Override
    public String getHeadTitle() {
        return "测试定位";
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tv_location = findViewById(R.id.tv_location);
        initLocation();

    }

    /**
     * 初始化定位
     */
    private void initLocation() {
        mlocationClient = new AMapLocationClient(this);
        //初始化定位参数
        mLocationOption = new AMapLocationClientOption();
        //设置定位监听
        mlocationClient.setLocationListener(this);
        //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //设置定位间隔,单位毫秒,默认为2000ms
//      mLocationOption.setInterval(2000);
        mLocationOption.setOnceLocation(true);//可选,设置是否单次定位。默认是false
        //设置定位参数
        mlocationClient.setLocationOption(mLocationOption);
    }

    public void location(View view) {
    /**
    android6.0 以上要动态申请权限
    */
        RxPermissions rxPermissions = new RxPermissions(this);
        rxPermissions.request(Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.READ_PHONE_STATE)
                .subscribe(new Observer<Boolean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Boolean aBoolean) {
                        mlocationClient.startLocation();
                    }
                });

    }


    @Override
    public void onLocationChanged(AMapLocation aMapLocation) {
        if (null != aMapLocation) {
            //解析定位结果
            String result = GDUtils.getLocationStr(aMapLocation);
            if (result != null) {
                tv_location.setText(result);
                Log.e(TAG, "onLocationChanged: " + result);
            }
        } else {
            Log.d(TAG, "定位失败");
        }
    }

  /**
             * 如果AMapLocationClient是在当前Activity实例化的,
             * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
             */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mlocationClient.stopLocation();
    }
}

GPSInfo

public class GPSInfo {
    private String ID;
    private String Name;
    public String getID() {
        return ID;
    }
    public void setID(String iD) {
        ID = iD;
    }
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        Name = name;
    }

}

GPSUtils

public class GDUtils {

    private static JSONObject object;
    private static JSONObject object2;
    private static String jsonString;
    private static List<GPSInfo> message; //保存数据的集合
    /**
     *  开始定位
     */
    public final static int MSG_LOCATION_START = 0;
    /**
     * 定位完成
     */
    public final static int MSG_LOCATION_FINISH = 1;
    /**
     * 停止定位
     */
    public final static int MSG_LOCATION_STOP= 2;

    public final static String KEY_URL = "URL";
    public final static String URL_H5LOCATION = "file:///android_asset/location.html";

    /**
     * 默认的定位参数
     * @since 2.8.0
     * @author hongming.wang
     *
     */
    public static AMapLocationClientOption getDefaultOption(){
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
        mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
        mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
        mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
        return mOption;
    }
    /**
     * 根据定位结果返回定位信息的字符串
     * @param location
     * @return
     */
    public synchronized static String getLocationStr(AMapLocation location){
        if(null == location){
            return null;
        }
        message = new ArrayList<GPSInfo>();
        //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
        if(location.getErrorCode() == 0){

            GPSInfo info = new GPSInfo();
            info.setID("province");
            info.setName(location.getProvince());
            message.add(info);

            info = new GPSInfo();
            info.setID("longitude");//经    度
            info.setName(location.getLongitude()+"");
            message.add(info);

            info = new GPSInfo();
            info.setID("latitude");//纬    度
            info.setName(location.getLatitude()+"");
            message.add(info);

            info = new GPSInfo();
            info.setID("address");
            info.setName(location.getAddress()+"");
            message.add(info);

            info = new GPSInfo();
            info.setID("district");//区
            info.setName(location.getDistrict()+"");
            message.add(info);

            info = new GPSInfo();
            info.setID("city");
            info.setName(location.getCity()+"");
            message.add(info);

        }
        if(message.size() > 0){
            return changeNotArrayDateToJson();
        }
        return null;
    }

    private static SimpleDateFormat sdf = null;
    public synchronized static String formatUTC(long l, String strPattern) {
        if (TextUtils.isEmpty(strPattern)) {
            strPattern = "yyyy-MM-dd HH:mm:ss";
        }
        if (sdf == null) {
            try {
                sdf = new SimpleDateFormat(strPattern, Locale.CHINA);
            } catch (Throwable e) {
            }
        } else {
            sdf.applyPattern(strPattern);
        }
        return sdf == null ? "NULL" : sdf.format(l);
    }
    /**
     * 转换为json数据
     */
    private static String changeNotArrayDateToJson() {
        object=null;
        object2=null;
        object=new JSONObject();
        object2=new JSONObject();
        try {
            for (int i = 0; i < message.size(); i++) {
                object2.put(message.get(i).getID(),message.get(i).getName()); //把数据加入JSONObject对象即可,"userid"相当于map里面的key,1即为value的值。
            }
            object.put("message", "coordinate");
            object.put("content", object2);
            object.put("code","0");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        jsonString=null;
        jsonString = object.toString();//把JSONObject转换成json格式的字符串
        return jsonString;
    }
    /**
     * 转换为json数据
     */
    public  static String changeUUIDToJson(String uuid) {
        object=null;
        object2=null;
        object=new JSONObject();
        object2=new JSONObject();
        try {
            object2.put("registrationId",uuid);
            object.put("message", "deviceId");
            object.put("content", object2);
            object.put("code","0");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        jsonString=null;
        jsonString = object.toString();//把JSONObject转换成json格式的字符串
        return jsonString;
    }
}

欢迎关注我的公众号,不定期分享学习资源和技术文章
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值