本文主要记录了如何使用高德地图来实现android应用特色开发
主要包括以下内容:
- 申请高德api key
- 使用android studio创建项目,并且引入高德地图的sdk
- 实现定位并在地图上标记
本文主要参考:《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());
}
}
以上代码已经有很详细的代码注释了,这里就不赘述了。