Android Google Map集成以及部分功能的实现

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

最近公司在做一个海外项目 有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());
    }
}

https://developers.google.cn/places/web-service/get-api-key(搜索相关)

https://translate.google.com.hk/translate?hl=zh-CN&sl=en&u=https://developers.google.com/maps/documentation/android-sdk/intro&prev=search(mark 手势相关)

https://translate.google.com.hk/translate?hl=zh-CN&sl=en&u=https://developers.google.com/maps/documentation/directions/intro&prev=search(计算线路相关)

https://console.developers.google.com/apis/credentials?project=unopenbox-android&hl=zh-cn(Google管理后台)

猜你喜欢

转载自blog.csdn.net/Mr___Xu/article/details/81508660