最近公司在做一个海外项目 有Google map的使用 话不多说进入正题:
首先vpn 手机必须能支持Google play服务 (我做的时候Google play服务要想安装手机必须root,但是现在国内的生产厂商都对Android机器阉割处理,我们公司所有的测试都root不了,貌似是6.0及以上都不可以,然后从美国那边现邮的测试机)vpn是测试机和电脑都要有,
1.首先要去google官网注册开发者账号,并申请key(Google map创建应用是要绑定信用卡的 第一年会免费 第二年的时候开始收费)
2.导入依赖在项目的build.gradle
compile 'com.google.android.gms:play-services-auth:15.0.1'
implementation 'com.google.android.gms:play-services-maps:15.0.1'
implementation 'com.google.android.gms:play-services-location:15.0.1'
3.在项目的build.gradle:
(复制粘贴看这里
mavenCentral()
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1' )
4.使用Android Studio安装Google Play Services
5.在布局文件中添加如下代码
<fragment
android:id="@+id/fm_google_map"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
6.将申请的key配置到清单文件的application节点中
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_map_key" />
7.在Activity的onCreate方法中添加如下代码
mGoogleMap = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.fm_google_map);
mGoogleMap.getMapAsync(this);
8.重写onMapReady方法
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng sydney = new LatLng(-34, 151);
googleMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
9.此时运行程序,会发现有如下效果
这地图中包含一些实现的功能;我再下面列举一下
功能1:搜索的功能 并且弹出搜索扩展列表
这个功能没有写好的api,要自己去Google 服务器获取
private void sendLocationAdressReques(String search) {
//url就是请求的接口 联网工具我就不往出贴了 用自己的吧
String url = String.format("https://maps.googleapis.com/maps/api/place/textsearch/json?key=这里是你自己的key&query=" +这里是你输入的内容+ "+in+" +in后边加的是你搜索得范围(国家或者省.市,我会在后边把怎么通过经纬度获取地域名写出来));
try {
OkHttpClientManager.getAsyn(url, new OkHttpClientManager.ResultCallback<MapActivityBean>() {
@Override
public void onError(Request request, Exception e) {
e.printStackTrace();
}
@Override
public void onResponse(MapActivityBean response) {
//返回的数据类型可以直接在浏览器上调一下接口就可以获取了
//这里就是获取的数据了然后就可以添加到你写的搜索列表中了
resultsBean1s.clear();
resultsBean1s.addAll(response.getResults());
mapActivityAdapter.notifyDataSetChanged();
}
});
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
功能2:点击搜索出来的列表位置显示点击的定位
直接调用api就ok
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(经度 纬度用逗号隔开), 13.0f));
功能3:在屏幕中心放一个大头针滑动地图的时候在屏幕下方显示地址信息
大头针的布局就不在这里写了
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: {
break;
}
case MotionEvent.ACTION_UP: {
int left = mapView.getLeft();
int top = mapView.getTop();
int right = mapView.getRight();
int bottom = mapView.getBottom();
// 获得屏幕点击的位置
SharedPreferencesUtil share = SharedPreferencesUtil.getinstance(MapActivity.this);
int x = (int) (mapView.getX() + (right - left) / 2);
int y = (int) (mapView.getY() + (bottom - top) / 2);
Projection projection = mMap.getProjection();
LatLng pt = projection.fromScreenLocation(new Point(x, y));
//tvAddress是你要展示数据的控件
tvAddress.setText(getAddress(context, pt.latitude, pt.longitude));
break;
}
}
return super.dispatchTouchEvent(ev);
}
功能4:右上角显示点击定位自己的button
然后让你的当前类实现OnMyLocationButtonClickListener
重写onMyLocationButtonClick
return false;
功能5:获取两点间的行车路线距离
这个也没有现成的api需要请求Google 服务器
在获取的这个借口返回数据的时候始终提示我这个api无效 (要是这样的话需要你到Google管理平台上手动启用这个api,进到google管理平台搜索disdance,然后点击启用就ok了)
//lat lng 起点经纬度 lat1 lng1 终点经纬度
private void getDisdance(String lat, String lng, String lat1, String lng1) {
final String[] disDance = {""};
OkHttpClientManager.postAsyn("https://maps.googleapis.com/maps/api/directions/json?origin=" + lat + "," + lng + "&destination=" + lat1 + "," + lng1 + "&key=这里是你申请的key", new OkHttpClientManager.ResultCallback<MapDisDance>() {
@Override
public void onError(Request request, Exception e) {
}
@Override
public void onResponse(MapDisDance response) throws JSONException {
//公里数
response.getRoutes().get(0).getLegs().get(0).getDistance().getText();
}
}, new OkHttpClientManager.Param("", ""));
}
功能6:根据经纬度获取国家名字 地区名字 zipCode(邮政编码)
public static String getAddress(Context context, double latitude, double longitude) {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
try {
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
//"经度:"+String.valueOf(address.get(0).getLongitude()*1E6)+"\n";
//"纬度:"+String.valueOf(address.get(0).getLatitude()*1E6)+"\n";
//"国家:"+address.get(0).getCountryName()+"\n";
//"省:"+address.get(0).getAdminArea()+"\n";
//"城市:"+address.get(0).getLocality()+"\n";
// "名称:"+address.get(0).getAddressLine(1)+"\n";
//"街道:"+address.get(0).getAddressLine(0);
//zip code: getPostalCode
return addresses.get(0).getAddressLine(0);
} catch (Exception e) {
e.printStackTrace();
return "unKnown";
}
}
功能7:判断GPS是否打开
private boolean checkGPSIsOpen() {
boolean isOpen;
LocationManager locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
isOpen = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
return isOpen;
}
还有点细节的地方需要注意像是需要下载它生成的josn文件需要放在你的项目中 再有需要SHA1 包名 key 千万别写错了不然一个出问题都会造成地图不能显示
功能8:禁用启用手势与工具
UiSettings settings = mMap.getUiSettings();
//工具禁用
settings.setMapToolbarEnabled(false);
//滚动(平移)手势
settings.setScrollGesturesEnabled(false);
//倾斜手势
settings.setTiltGesturesEnabled(false);
//旋转手势
settings.setRotateGesturesEnabled(false);
//缩放手势
settings.setZoomGesturesEnabled(false);
目前整理这些 附上几个官方文档 以备不时之需 自己做一个整理
功能9:进入地图定位到当前
private FusedLocationProviderClient mFusedLocationProviderClient;
//这个方法在地图的onMapReady方法中执行
private void getDeviceLocation() {
try {
Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
locationResult.addOnCompleteListener(new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if (task.isSuccessful()) {
Location location = task.getResult();
//获取到当前的经纬度传入movecamera中就ok了
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 13.0f));
}
}
});
} catch (SecurityException e) {
Log.e("Exception: %s", e.getMessage());
}
}