Google Map Api for Android

项目需要使用了谷歌的地图api,总结一下。
先上几个图

一、项目介绍

1.点击搜索附近的公园

这个展示的可以点击地图的任意位置获取经纬度,并标记Mark一个点,同时获取附近的公园,就是POI Search,并把所有的公园在地图上标记出来。

2.搜索当前位置附近的公园

这个是通过定位,获取附近的公园


二、实现过程

1.Google Map Api Key申请

获取api key,基本的api可以不用绑定信用卡激活账号,在安卓中的定位,显示地图等操作就不需要激活账号。搜索附近的公园等POI操作的api就需要激活账号了。关于api的获取就不细说了。

2.新建Android项目

在Android Studio中,新建一个Map Activity,这个是自带的,我们只需要在debug目录下填入申请的api key就可以了。

3.需求–定位当前位置获取兴趣点(获取附近的公园)

MainActivity

package com.example.cacp;import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;public class MainActivity extends FragmentActivity implements OnMapReadyCallback,GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener {//google mapprivate GoogleMap mMap;double latitude;double longitude;//search nearby interest rangeprivate int PROXIMITY_RADIUS = 10000;GoogleApiClient mGoogleApiClient;Location mLastLocation;Marker mCurrLocationMarker;LocationRequest mLocationRequest;private Context mContext;private Button btn_list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_maps);mContext = this;btn_list = findViewById(R.id.btn_list);if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {checkLocationPermission();}//Check if Google Play Services Available or notif (!CheckGooglePlayServices()) {Log.d("onCreate", "Finishing test case since Google Play Services are not available");finish();}else {Log.d("onCreate","Google Play Services available.");}// Obtain the SupportMapFragment and get notified when the map is ready to be used.SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);mapFragment.getMapAsync(this);btn_list.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {startActivity(new Intent(MainActivity.this,ListActivity.class));}});}private boolean CheckGooglePlayServices() {GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();int result = googleAPI.isGooglePlayServicesAvailable(this);if(result != ConnectionResult.SUCCESS) {if(googleAPI.isUserResolvableError(result)) {googleAPI.getErrorDialog(this, result,0).show();}return false;}return true;}/*** Manipulates the map once available.* This callback is triggered when the map is ready to be used.* This is where we can add markers or lines, add listeners or move the camera. In this case,* we just add a marker near Sydney, Australia.* If Google Play services is not installed on the device, the user will be prompted to install* it inside the SupportMapFragment. This method will only be triggered once the user has* installed Google Play services and returned to the app.*/@Overridepublic void onMapReady(GoogleMap googleMap) {mMap = googleMap;mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);buildGoogleApiClient();mMap.setMyLocationEnabled(true);}private void POI(){mMap.clear();if (mCurrLocationMarker != null) {mCurrLocationMarker.remove();}String url = getUrl(latitude, longitude, "park");Object[] DataTransfer = new Object[4];DataTransfer[0] = mMap;DataTransfer[1] = url;DataTransfer[2] = mContext;DataTransfer[3] = btn_list;GetNearbyPlacesData getNearbyPlacesData = new GetNearbyPlacesData();getNearbyPlacesData.execute(DataTransfer);}protected synchronized void buildGoogleApiClient() {mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build();mGoogleApiClient.connect();}@Overridepublic void onConnected(Bundle bundle) {mLocationRequest = new LocationRequest();mLocationRequest.setInterval(1000);mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED) {LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);}}private String getUrl(double latitude, double longitude, String nearbyPlace) {StringBuilder googlePlaceUrl = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");googlePlaceUrl.append("location="+latitude+","+longitude);googlePlaceUrl.append("&radius="+PROXIMITY_RADIUS);googlePlaceUrl.append("&type="+nearbyPlace);googlePlaceUrl.append("&sensor=true");googlePlaceUrl.append("&key="+"不让你看我的key");Log.d("getUrl", googlePlaceUrl.toString());return (googlePlaceUrl.toString());}@Overridepublic void onConnectionSuspended(int i) {}@Overridepublic void onLocationChanged(Location location) {Log.d("onLocationChanged", "entered");mLastLocation = location;if (mCurrLocationMarker != null) {mCurrLocationMarker.remove();}//Place current location markerlatitude = location.getLatitude();longitude = location.getLongitude();LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());MarkerOptions markerOptions = new MarkerOptions();markerOptions.position(latLng);markerOptions.title("Current Position");
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));mCurrLocationMarker = mMap.addMarker(markerOptions);//move map cameramMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));mMap.animateCamera(CameraUpdateFactory.zoomTo(11));Toast.makeText(MainActivity.this,"Your Current Location", Toast.LENGTH_LONG).show();Log.d("onLocationChanged", String.format("latitude:%.3f longitude:%.3f",latitude,longitude));//stop location updatesif (mGoogleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);Log.d("onLocationChanged", "Removing Location Updates");}Log.d("onLocationChanged", "Exit");POI();}@Overridepublic void onConnectionFailed(ConnectionResult connectionResult) {}

处理后的数据用来在地图上标记兴趣点,我们给了标记点点击事件,并传递了一些数据。
GetNearbyPlacesData

package com.example.cacp;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.Button;import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import java.util.HashMap;
import java.util.List;
public class GetNearbyPlacesData extends AsyncTask<Object, String, String> {String googlePlacesData;GoogleMap mMap;String url;Context mContext;Button btn_list;@Overrideprotected String doInBackground(Object... params) {try {Log.d("GetNearbyPlacesData", "doInBackground entered");mMap = (GoogleMap) params[0];url = (String) params[1];mContext = (Context) params[2];btn_list = (Button) params[3];DownloadUrl downloadUrl = new DownloadUrl();googlePlacesData = downloadUrl.readUrl(url);Log.d("GooglePlacesReadTask", "doInBackground Exit");} catch (Exception e) {Log.d("GooglePlacesReadTask", e.toString());}return googlePlacesData;}@Overrideprotected void onPostExecute(String result) {Log.d("GooglePlacesReadTask", "onPostExecute Entered");List<HashMap<String, String>> nearbyPlacesList = null;DataParser dataParser = new DataParser();nearbyPlacesList =  dataParser.parse(result);Singleton.getInstance().setListPlace(nearbyPlacesList);ShowNearbyPlaces(nearbyPlacesList);btn_list.setVisibility(View.VISIBLE);Log.d("GooglePlacesReadTask", "onPostExecute Exit");}private void ShowNearbyPlaces(List<HashMap<String, String>> nearbyPlacesList) {for (int i = 0; i < nearbyPlacesList.size(); i++) {Log.d("onPostExecute","Entered into showing locations");MarkerOptions markerOptions = new MarkerOptions();final HashMap<String, String> googlePlace = nearbyPlacesList.get(i);double lat = Double.parseDouble(googlePlace.get("lat"));double lng = Double.parseDouble(googlePlace.get("lng"));String placeName = googlePlace.get("place_name");String vicinity = googlePlace.get("vicinity");LatLng latLng = new LatLng(lat, lng);markerOptions.position(latLng);markerOptions.title(placeName + " : " + vicinity);mMap.addMarker(markerOptions);markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));//move map cameramMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));mMap.animateCamera(CameraUpdateFactory.zoomTo(11));mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker marker) {Intent intent = new Intent(mContext, DetailActivity.class);intent.putExtra("placename", googlePlace.get("place_name"));intent.putExtra("id", googlePlace.get("id"));intent.putExtra("rating", "rating :" + googlePlace.get("rating"));intent.putExtra("info", googlePlace.get("lat")+","+googlePlace.get("lng"));final String photoUrl = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference="+ googlePlace.get("photo_reference") +"&key=不让你看我的key";intent.putExtra("photourl", photoUrl);mContext.startActivity(intent);return false;}});}}
}

4.需求–任意点击屏幕位置获取附近兴趣点(获取附近的公园)

我们只是把定位那一部分换成了监听点击地图事件

GoogleMap点击事件监听

mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {@Overridepublic void onMapClick(LatLng latLng) {markPark(latLng);}});

Mark标记点

private void markPark(LatLng latLng){mMap.clear();if (mCurrLocationMarker != null) {mCurrLocationMarker.remove();}MarkerOptions markerOptions = new MarkerOptions();markerOptions.position(latLng);markerOptions.title("Current Position");markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));mCurrLocationMarker = mMap.addMarker(markerOptions);//move map cameramMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));mMap.animateCamera(CameraUpdateFactory.zoomTo(11));POI(latLng);Toast.makeText(Main2Activity.this,String.format("latitude:%.3f longitude:%.3f",latLng.latitude,latLng.longitude),Toast.LENGTH_LONG).show();}

完整代码

package com.example.cacp;import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.widget.Button;
import android.widget.Toast;import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;public class Main2Activity extends FragmentActivity implements OnMapReadyCallback {private GoogleMap mMap;private Marker mCurrLocationMarker;private int PROXIMITY_RADIUS = 10000;private Context mContext;private Button btn_list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_maps);mContext = this;btn_list = findViewById(R.id.btn_list);if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {checkLocationPermission();}//Check if Google Play Services Available or notif (!CheckGooglePlayServices()) {Log.d("onCreate", "Finishing test case since Google Play Services are not available");finish();}else {Log.d("onCreate","Google Play Services available.");}// Obtain the SupportMapFragment and get notified when the map is ready to be used.SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);mapFragment.getMapAsync(this);}private boolean CheckGooglePlayServices() {GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();int result = googleAPI.isGooglePlayServicesAvailable(this);if(result != ConnectionResult.SUCCESS) {if(googleAPI.isUserResolvableError(result)) {googleAPI.getErrorDialog(this, result,0).show();}return false;}return true;}@Overridepublic void onMapReady(GoogleMap googleMap) {mMap = googleMap;mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED) {mMap.setMyLocationEnabled(true);}}else {mMap.setMyLocationEnabled(true);}markPark(new LatLng(52.388,-1.291));mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {@Overridepublic void onMapClick(LatLng latLng) {markPark(latLng);}});}private void markPark(LatLng latLng){mMap.clear();if (mCurrLocationMarker != null) {mCurrLocationMarker.remove();}MarkerOptions markerOptions = new MarkerOptions();markerOptions.position(latLng);markerOptions.title("Current Position");markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));mCurrLocationMarker = mMap.addMarker(markerOptions);//move map cameramMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));mMap.animateCamera(CameraUpdateFactory.zoomTo(11));POI(latLng);Toast.makeText(Main2Activity.this,String.format("latitude:%.3f longitude:%.3f",latLng.latitude,latLng.longitude),Toast.LENGTH_LONG).show();}public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;public boolean checkLocationPermission(){if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_LOCATION);} else {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_LOCATION);}return false;} else {return true;}}@Overridepublic void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {switch (requestCode) {case MY_PERMISSIONS_REQUEST_LOCATION: {if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED) {mMap.setMyLocationEnabled(true);}} else {Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show();}return;}}}private void POI(LatLng latLng){String url = getUrl(latLng.latitude, latLng.longitude, "park");Object[] DataTransfer = new Object[4];DataTransfer[0] = mMap;DataTransfer[1] = url;DataTransfer[2] = mContext;DataTransfer[3] = btn_list;GetNearbyPlacesData getNearbyPlacesData = new GetNearbyPlacesData();getNearbyPlacesData.execute(DataTransfer);}private String getUrl(double latitude, double longitude, String nearbyPlace) {StringBuilder googlePlaceUrl = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");googlePlaceUrl.append("location="+latitude+","+longitude);googlePlaceUrl.append("&radius="+PROXIMITY_RADIUS);googlePlaceUrl.append("&type="+nearbyPlace);googlePlaceUrl.append("&sensor=true");googlePlaceUrl.append("&key="+"不给你看我的key");Log.d("getUrl", googlePlaceUrl.toString());return (googlePlaceUrl.toString());}
}

两部分的xml文件都一样,都可以用Android Studio自动生成的Map Activity的布局文件


三、需要demo的请留言

需要demo的请留言

Google Map Api for Android相关推荐

  1. 申请google Map api key for android

    申请android google map API key 1.首先找到debug keystore位置: 打开Eclipse--->Windows--->Preferences---> ...

  2. Android传感器、语音识别、定位系统、Google Map API、快捷方式、widget编程总结及示例

    Android特色开发 第一部分 传感器    传感器是一种物理装置或生物器官,能够探测.感受外界的信号.物理条件(如:光.热.湿度)或化学组成(如:烟雾),并将探知的信息传递给其他设备或器官.    ...

  3. Android传感器、语音识别、定位系统、Google Map API、快捷方式、widget编程总结及示例...

    Android特色开发 第一部分 传感器 传感器是一种物理装置或生物器官,能够探测.感受外界的信号.物理条件(如:光.热.湿度)或化学组成(如:烟雾),并将探知的信息传递给其他设备或器官. Andro ...

  4. android google map key,android google map api key取得?

    我有一个项目的谷歌地图apikey现在我想要另一个项目的apikey和这个项目的keystore是在一个不同的地方.我的第一个cmd:android google map api key取得? &qu ...

  5. android手机安装时缺少google map api 的解决方法

    有些android手机,机器里没有com.google.android.maps.jar这个包. 所以当开发使用了google  map  api的程序时,即使在模拟器上没有问题,但是在真机上无法安装 ...

  6. 关于Google Map API V2 版本的定位与导航

    近来,在关注安卓手机上的GoogleMap应用的开发,但是目前官方API版本网页版已经升级到V3版,而对于Android的支持也已经升级到V2版本,虽然Google说继续对V1版提供服务,但是不再提供 ...

  7. Google Map API 使用总结

    Google Map API (一):显示一个最基本的地图 1 实现一个地图: <head>中引用: <script type="text/javascript" ...

  8. google map api key申请

    不会申请google map api key的童鞋看过来啊,看过来啊 以前玩的是百度地图,如今想玩谷歌地图,发现申请key有点小麻烦啊,但是一切都难不倒哥啊 首先大家进这个网站:https://cod ...

  9. Google Maps API for Android 指南(一)

    概览 Android版Google API 介绍. 通过Android版的Google API,开发者可以基于Google Map的数据开发自己的APP,API将自动连接至Google Map服务器. ...

最新文章

  1. ubuntu18 安装python3.8.tgz
  2. Java Web整合开发(41) -- Forum
  3. 41.和为s的两个数字 VS 和为s的连续正数序列
  4. /proc/asound详细介绍
  5. [转载]我的博后申请经历从陶瓷到Offer过程
  6. 要闻君说:谷歌云重磅发布两大技术平台;以后可以打飞滴了?SAP重组动荡;微软宣布 Azure Functions 支持 Java...
  7. MVC系统的Filter
  8. PHP根据配置设置可变变量
  9. MayaDay1:历史记录和删除历史记录
  10. java.lang.InstantiationException: com.lch.commder.entity.Car 已解决
  11. 苹果操作系统 Mac OS 查看网络中电脑的端口是否开放
  12. React心得之降龙十八掌:第三式-见龙在田( 组件生命周期详解)
  13. vue中el-radio-group点击事件,双击取消
  14. 用PHP实现虎牙压豆稳赚不赔的方法,RNG和LGD比赛竞猜结算出错被骂骗豆平台,虎牙道歉又送5000Q币...
  15. 高等数学术语英汉对照
  16. systools ssd data recovery怎么用呢
  17. 使用shuffle进行打乱数据的问题总结
  18. 和程序员约会的十个理由
  19. 信号与系统(Python) 学习笔记摘录 (2) 傅里叶 Fourier
  20. MD5 SHA1 HMAC HMAC_SHA1区别(转载网上大牛)个人备忘和加注了

热门文章

  1. 浅谈综述论文:文献综述
  2. Leetcode 1647. Minimum Deletions to Make Character Frequencies Unique [Python]
  3. 产品720vr全景摄影展示吸引客户主动浏览
  4. 比尔盖兹退休告别演说:下个数位十年
  5. 旺店通·企业奇门与金蝶云星空对接集成查询采购入库单连通采购入库新增(采购入库单 all)
  6. 不重启JVM动态添加日志(阿里Arthas)
  7. IEEE Access LaTex 版本问题(一):图片的标注无法换行、无法左对齐以及如何加粗
  8. 项目经理应该如何制定项目进度计划?
  9. html怎么设置视频不能快进,【浏览器插件】Video Speed Controller – 网页视频倍速、快进、回放功能0.07~16 倍...
  10. 巧记作宾语补足语的省略to 的动词不定式