Android 使用高德地图SDK

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/W3Chhhhhh/article/details/85337279

本文主要记录了如何使用高德地图来实现android应用特色开发

主要包括以下内容:

  1. 申请高德api key
  2. 使用android studio创建项目,并且引入高德地图的sdk
  3. 实现定位并在地图上标记

本文主要参考:《android第一行代码》,高德开发者文档https://lbs.amap.com/api/android-sdk/gettingstarted,最终运行的效果如下:

申请高德api key

打开官网注册进入控制台,点击我的应用,创建新应用,然后点击添加key:

在这里SHA1是我们申请key必须填写的字段,使我们项目打包程序时所用签名文件的SHA1指纹。可以通过点击右侧工具栏->项目名->:app->Tasks->android,然后点击signingReport,就能够在我们的控制台看到SHA1的字符串,这里粘贴拷贝到上述输入框即可。这样完善相关信息后我们就能够继续我们的后续的开发工作了(还有一个主意点packagename是指你的程序创建包的路径,这个也不能乱填,否则会调用),最后会得到我们的app key:

使用android studio创建项目,并且引入高德地图的sdk

 接下来创建我们自己的android项目,引入包如下:

说明:libs为高德两个jar包分别为关于定位和3dmap地图的包,这里直接拷贝到libs文件夹下面,然后我们在解压3dmap包的时候还会有其余的目录文件,这个是so文件是Native层要用到的,我们在src/main文件夹下新建jniLibs文件夹,然后把那些so文件目录拷贝过来,然后点击工具栏上Sync Now指示,这里必须要手动点击一下,不然项目无法引用所添加jar包的接口。这样我们的开发环境搭建完成,下面进行正式开发。

实现定位并在地图上标记

 1.修改AndroidManifest.xml文件如下:

  

 <!--用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <!--用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <!--获取运营商信息,用于支持提供运营商信息相关的接口-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
    <!--用于访问网络,网络定位需要上网-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <!--用于读取手机当前的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <!--用于申请调用A-GPS模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <!--用于申请获取蓝牙信息进行室内定位-->
    <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

    <application
        android: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-data android:name="com.amap.api.v2.apikey"
            android:value="你申请的key">
        </meta-data>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name="com.amap.api.location.APSService"></service>
    </application>

注意在上述key中输入你刚申请的高德应用app key,并未引用申请一些必要的权限。

2.  编写前端activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:id="@+id/text_location"
        android:visibility="gone"/>

    <com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

 3. 编写活动实现功能MainActivity.java:

package com.example.chenpeng.lbstest;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
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.CameraUpdate;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.MarkerOptions;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    // TextView
    private TextView textView;

    // 声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;

    // 异步获取定位结果
    AMapLocationListener aMapLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    // 更新页面
                    // updateUI(aMapLocation);

                    // 定位当前
                    navigateTo(aMapLocation);
                }
            }
        }
    };

    /////////////////////////////////// 地图 ///////////////////////////////////
    private MapView mapView = null;
    private AMap aMap = null;
    private boolean isFirstLocate = true;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLocationClient = new AMapLocationClient(getApplicationContext());
        mLocationClient.setLocationListener(aMapLocationListener);
        setContentView(R.layout.activity_main);
        // 获取textView组件
        textView = findViewById(R.id.text_location);

        // 申请权限
        List<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 {
            // 开始定位
            requestLocation();
        }

        ////////////////地图/////////////////
        mapView = findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);
        if (aMap == null) {
            aMap = mapView.getMap();
        }
    }

    /**
     * 启动定位
     */
    private void requestLocation() {
        initLocation();
        mLocationClient.startLocation();
    }

    /**
     * 设置定位参数
     */
    private void initLocation() {
        AMapLocationClientOption option = new AMapLocationClientOption();
        option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        option.setInterval(5000);// 2s跟新一次
        option.setNeedAddress(true); // 获取精度较高的地址
        mLocationClient.setLocationOption(option);

    }

    /**
     * 动态申请权限的结果
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for (int result : grantResults) {
                        if (result != PackageManager.PERMISSION_DENIED) {
                            Toast.makeText(this, "必须同意所有的权限", Toast.LENGTH_SHORT).show();
                            // 结束活动
                            finish();
                            return;
                        }
                    }
                    // 开始请求地里位置
                    requestLocation();
                } else {
                    Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            default:
                break;
        }
    }

    /**
     * 销毁
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 停止定位
        mLocationClient.stopLocation();
        // 销毁地图
        mapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
        mapView.onSaveInstanceState(outState);
    }


    /**
     * 将地图视点移动到某一位置
     *
     * @param aMapLocation
     */
    private void navigateTo(AMapLocation aMapLocation) {
        if (isFirstLocate) {
            LatLng curLng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
            CameraUpdate mCameraUpdate = CameraUpdateFactory.newCameraPosition(
                    new CameraPosition(
                            curLng, // location
                            18, // zoom
                            30, // 可视区域倾斜度
                            0) // 可视区域指向的方向
            );
            aMap.animateCamera(mCameraUpdate, 1000, new AMap.CancelableCallback() {
                @Override
                public void onFinish() {

                }

                @Override
                public void onCancel() {

                }
            });

            // 绘制点
            aMap.addMarker(new MarkerOptions().position(curLng).title("我的位置").snippet("江苏科技大学"));

//            LatLng ll = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
//            aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
//            aMap.moveCamera(CameraUpdateFactory.changeLatLng(ll));

            isFirstLocate = false;
        }
    }

    /**
     * 更新ui结果
     *
     * @param aMapLocation
     */
    private void updateUI(AMapLocation aMapLocation) {
        // 解析定位结果
        StringBuilder currentPosition = new StringBuilder();
        currentPosition.append("纬度:").append(aMapLocation.getLatitude()).append("\n");
        currentPosition.append("经度:").append(aMapLocation.getLongitude()).append("\n");
        currentPosition.append("精度:")
                .append(aMapLocation.getAccuracy())
                .append("\n");
        currentPosition.append("时间:")
                .append(aMapLocation.getTime())
                .append("\n");
        currentPosition.append("地址")
                .append(aMapLocation.getAddress())
                .append("\n");
        currentPosition.append("国家")
                .append(aMapLocation.getCountry())
                .append("\n");
        currentPosition.append("省份:")
                .append(aMapLocation.getProvince())
                .append("\n");
        currentPosition.append("城市:")
                .append(aMapLocation.getCity())
                .append("\n");
        currentPosition.append("城区:")
                .append(aMapLocation.getDistrict())
                .append("\n");
        currentPosition.append("街道:")
                .append(aMapLocation.getStreet())
                .append("\n");
        currentPosition.append("描述:").append(aMapLocation.getDescription()).append("\n");
        currentPosition.append("定位type:").append(aMapLocation.getLocationType()).append("\n");
        currentPosition.append("定位方式:");
        if (aMapLocation.getLocationType() == AMapLocation.LOCATION_TYPE_GPS) {
            currentPosition.append("GPS");
        } else if (aMapLocation.getLocationType() == AMapLocation.LOCATION_TYPE_WIFI) {
            currentPosition.append("网络");
        }
        textView.setText(currentPosition.toString());
    }
}

以上代码已经有很详细的代码注释了,这里就不赘述了。 

猜你喜欢

转载自blog.csdn.net/W3Chhhhhh/article/details/85337279