博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
免费下载谷歌maps软件_Android Google Maps当前位置,夜间模式功能
阅读量:2533 次
发布时间:2019-05-11

本文共 17856 字,大约阅读时间需要 59 分钟。

免费下载谷歌maps软件

In this tutorial, we’ll play around with the Android Google Maps API. Showing the user the current location, lat/lng bounds, start navigation, enabling night mode etc.

在本教程中,我们将使用Android Google Maps API。 向用户显示当前位置,纬度/经度边界,开始导航,启用夜间模式等。

Android Google Maps当前位置 (Android Google Maps Current Location)

Before we start implementing some cool android google maps features in our application, add the Google Maps v2 API key value in the meta-data tag in the AndroidManifest.xml file as mentioned in .

在我们开始在我们的应用程序中实现一些很酷的android google maps功能之前,请按照中的说明在AndroidManifest.xml文件的meta-data标签中添加Google Maps v2 API密钥值。

Create a new project in Android Studio and select the template as Google Maps Activity.

在Android Studio中创建一个新项目,然后选择模板作为Google Maps Activity。

Note: Google Play Services dependency will be added by default for this template.

注意 :默认情况下,将为该模板添加Google Play服务依赖项。

Implement Google Play Location Services in your MapsActivity.java class as shown below.

如下所示,在您的MapsActivity.java类中实现Google Play定位服务。

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,        GoogleApiClient.OnConnectionFailedListener, LocationListener {    private GoogleMap mMap;    Location mLocation;    GoogleApiClient mGoogleApiClient;    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;    private LocationRequest mLocationRequest;    private long UPDATE_INTERVAL = 15000;  /* 15 secs */    private long FASTEST_INTERVAL = 5000; /* 5 secs */    private ArrayList permissionsToRequest;    private ArrayList permissionsRejected = new ArrayList();    private ArrayList permissions = new ArrayList();    private final static int ALL_PERMISSIONS_RESULT = 101;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_maps);        // 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);        permissions.add(ACCESS_FINE_LOCATION);        permissions.add(ACCESS_COARSE_LOCATION);        permissionsToRequest = findUnAskedPermissions(permissions);        //get the permissions we have asked for before but are not granted..        //we will store this in a global list to access later.        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            if (permissionsToRequest.size() > 0)                requestPermissions(permissionsToRequest.toArray(new String[permissionsToRequest.size()]), ALL_PERMISSIONS_RESULT);        }        mGoogleApiClient = new GoogleApiClient.Builder(this)                .addApi(LocationServices.API)                .addConnectionCallbacks(this)                .addOnConnectionFailedListener(this)                .build();        connectClient();    }    /**     * 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.     */    @Override    public void onMapReady(GoogleMap googleMap) {        mMap = googleMap;        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            // TODO: Consider calling            //    ActivityCompat#requestPermissions            // here to request the missing permissions, and then overriding            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,            //                                          int[] grantResults)            // to handle the case where the user grants the permission. See the documentation            // for ActivityCompat#requestPermissions for more details.            return;        }        mMap.setMyLocationEnabled(true);    }    public void connectClient()    {        mGoogleApiClient = new GoogleApiClient.Builder(this)                .addApi(LocationServices.API)                .addConnectionCallbacks(this)                .addOnConnectionFailedListener(this)                .build();    }    private ArrayList findUnAskedPermissions(ArrayList wanted) {        ArrayList result = new ArrayList();        for (String perm : wanted) {            if (!hasPermission(perm)) {                result.add(perm);            }        }        return result;    }    @Override    protected void onStart() {        super.onStart();        if (mGoogleApiClient != null) {            mGoogleApiClient.connect();        }    }    @Override    protected void onResume() {        super.onResume();        if (!checkPlayServices()) {            Toast.makeText(getApplicationContext(),"Please install google play services",Toast.LENGTH_LONG).show();        }    }    @Override    public void onConnected(@Nullable Bundle bundle) {        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            // TODO: Consider calling            //    ActivityCompat#requestPermissions            // here to request the missing permissions, and then overriding            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,            //                                          int[] grantResults)            // to handle the case where the user grants the permission. See the documentation            // for ActivityCompat#requestPermissions for more details.            return;        }        mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);        startLocationUpdates();    }    @Override    public void onConnectionSuspended(int i) {    }    @Override    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {    }    @Override    public void onLocationChanged(Location location) {    }    private boolean checkPlayServices() {        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);        if (resultCode != ConnectionResult.SUCCESS) {            if (apiAvailability.isUserResolvableError(resultCode)) {                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)                        .show();            } else                finish();            return false;        }        return true;    }    protected void startLocationUpdates() {        mLocationRequest = new LocationRequest();        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);        mLocationRequest.setInterval(UPDATE_INTERVAL);        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            Toast.makeText(getApplicationContext(), "Enable Permissions", Toast.LENGTH_LONG).show();        }        LocationServices.FusedLocationApi.requestLocationUpdates(                mGoogleApiClient, mLocationRequest, this);    }    private boolean hasPermission(String permission) {        if (canMakeSmores()) {            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                return (checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED);            }        }        return true;    }    private boolean canMakeSmores() {        return (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1);    }    @TargetApi(Build.VERSION_CODES.M)    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        switch (requestCode) {            case ALL_PERMISSIONS_RESULT:                for (String perms : permissionsToRequest) {                    if (!hasPermission(perms)) {                        permissionsRejected.add(perms);                    }                }                if (permissionsRejected.size() > 0) {                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                        if (shouldShowRequestPermissionRationale(permissionsRejected.get(0))) {                            showMessageOKCancel("These permissions are mandatory for the application. Please allow access.",                                    new DialogInterface.OnClickListener() {                                        @Override                                        public void onClick(DialogInterface dialog, int which) {                                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                                                requestPermissions(permissionsRejected.toArray(new String[permissionsRejected.size()]), ALL_PERMISSIONS_RESULT);                                            }                                        }                                    });                            return;                        }                    }                }                break;        }    }    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {        new AlertDialog.Builder(MapsActivity.this)                .setMessage(message)                .setPositiveButton("OK", okListener)                .setNegativeButton("Cancel", null)                .create()                .show();    }    @Override    protected void onDestroy() {        super.onDestroy();        stopLocationUpdates();    }    public void stopLocationUpdates()    {        if (mGoogleApiClient.isConnected()) {            LocationServices.FusedLocationApi                    .removeLocationUpdates(mGoogleApiClient, this);            mGoogleApiClient.disconnect();        }    }}

In the above code mMap.setMyLocationEnabled(true); is used to show the user’s current location.

在上面的代码中, mMap.setMyLocationEnabled(true); 用于显示用户的当前位置。

The below image is the output of the application when the above code is run.

android google maps

下图是运行上述代码时应用程序的输出。

The blue dot is our current location. We need to focus the camera on the current location in the map to prevent zooming and scrolling manually.

蓝点是我们当前的位置。 我们需要将相机聚焦在地图上的当前位置,以防止手动缩放和滚动。

Change the onConnected() method as;

onConnected()方法更改为;

@Override    public void onConnected(@Nullable Bundle bundle) {        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            // TODO: Consider calling            //    ActivityCompat#requestPermissions            // here to request the missing permissions, and then overriding            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,            //                                          int[] grantResults)            // to handle the case where the user grants the permission. See the documentation            // for ActivityCompat#requestPermissions for more details.            return;        }        mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);        LatLng latLng = new LatLng(mLocation.getLatitude(), mLocation.getLongitude());        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 12);        mMap.animateCamera(cameraUpdate);        startLocationUpdates();    }

In the above code 12 is the zoom level set. We can set the minimum and maximum zoom level using mMap.setMinZoomPreference(float v); and mMap.setMaxZoomPreference(float v);.

在上面的代码12中设置了缩放级别。 我们可以使用mMap.setMinZoomPreference(float v);设置最小和最大缩放级别mMap.setMinZoomPreference(float v);mMap.setMaxZoomPreference(float v);

Android Google Maps Night模式项目结构 (Android Google Maps Night Mode Project Structure)

To enable night mode in the apps. We need to set the map style in the onMapReady method as;

在应用程序中启用夜间模式。 我们需要在onMapReady方法中将地图样式设置为;

mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(this, R.raw.mapstyle_night));

mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(this, R.raw.mapstyle_night));

The mapstyle_night.json code is shown below.

mapstyle_night.json代码如下所示。

[  {    "featureType": "all",    "elementType": "geometry",    "stylers": [      {        "color": "#242f3e"      }    ]  },  {    "featureType": "all",    "elementType": "labels.text.stroke",    "stylers": [      {        "lightness": -80      }    ]  },  {    "featureType": "administrative",    "elementType": "labels.text.fill",    "stylers": [      {        "color": "#746855"      }    ]  },  {    "featureType": "administrative.locality",    "elementType": "labels.text.fill",    "stylers": [      {        "color": "#d59563"      }    ]  },  {    "featureType": "poi",    "elementType": "labels.text.fill",    "stylers": [      {        "color": "#d59563"      }    ]  },  {    "featureType": "poi.park",    "elementType": "geometry",    "stylers": [      {        "color": "#263c3f"      }    ]  },  {    "featureType": "poi.park",    "elementType": "labels.text.fill",    "stylers": [      {        "color": "#6b9a76"      }    ]  },  {    "featureType": "road",    "elementType": "geometry.fill",    "stylers": [      {        "color": "#2b3544"      }    ]  },  {    "featureType": "road",    "elementType": "labels.text.fill",    "stylers": [      {        "color": "#9ca5b3"      }    ]  },  {    "featureType": "road.arterial",    "elementType": "geometry.fill",    "stylers": [      {        "color": "#38414e"      }    ]  },  {    "featureType": "road.arterial",    "elementType": "geometry.stroke",    "stylers": [      {        "color": "#212a37"      }    ]  },  {    "featureType": "road.highway",    "elementType": "geometry.fill",    "stylers": [      {        "color": "#746855"      }    ]  },  {    "featureType": "road.highway",    "elementType": "geometry.stroke",    "stylers": [      {        "color": "#1f2835"      }    ]  },  {    "featureType": "road.highway",    "elementType": "labels.text.fill",    "stylers": [      {        "color": "#f3d19c"      }    ]  },  {    "featureType": "road.local",    "elementType": "geometry.fill",    "stylers": [      {        "color": "#38414e"      }    ]  },  {    "featureType": "road.local",    "elementType": "geometry.stroke",    "stylers": [      {        "color": "#212a37"      }    ]  },  {    "featureType": "transit",    "elementType": "geometry",    "stylers": [      {        "color": "#2f3948"      }    ]  },  {    "featureType": "transit.station",    "elementType": "labels.text.fill",    "stylers": [      {        "color": "#d59563"      }    ]  },  {    "featureType": "water",    "elementType": "geometry",    "stylers": [      {        "color": "#17263c"      }    ]  },  {    "featureType": "water",    "elementType": "labels.text.fill",    "stylers": [      {        "color": "#515c6d"      }    ]  },  {    "featureType": "water",    "elementType": "labels.text.stroke",    "stylers": [      {        "lightness": -20      }    ]  }]

Enable traffics in the map by the following code:

通过以下代码在地图中启用路况:

mMap.setTrafficEnabled(true);

mMap.setTrafficEnabled(true);

mMap.setLatLngBoundsForCameraTarget(); is used to constrain the lat/lng center bounds of the focal point of the map (the camera target) so that users can only scroll and pan within these bounds.

mMap.setLatLngBoundsForCameraTarget(); 用于约束地图焦点(相机目标)的纬度/经度中心边界,以便用户只能在这些边界内滚动和平移。

To implement the above. Let’s take LatLngBounds for a part of city Adelaide for example.

Following is a snippet that’s put inside onMapReady method

实现以上。 让我们以LatLngBounds为例,以阿德莱德市为例。

以下是放在onMapReady方法中的代码段

final LatLngBounds ADELAIDE = new LatLngBounds(            new LatLng(-35.0, 138.58), new LatLng(-34.9, 138.61));final CameraPosition ADELAIDE_CAMERA = new CameraPosition.Builder()            .target(new LatLng(-34.92873, 138.59995)).zoom(20.0f).bearing(0).tilt(0).build();mMap.setLatLngBoundsForCameraTarget(ADELAIDE);        mMap.addMarker(new MarkerOptions()                .position(new LatLng(-34.92873, 138.59995))                .title("My Marker"));        mMap.animateCamera(CameraUpdateFactory.newCameraPosition(ADELAIDE_CAMERA));

Following is the output of the application.

以下是该应用程序的输出。

Android Google Maps –启动Google导航 (Android Google Maps – Start Google Navigation)

To start navigation app we need to pass the latitude and longitude of the destination in the following way:

要启动导航应用,我们需要通过以下方式传递目的地的经度和纬度:

String nav_lat=22.7213129;String nav_lng=75.8763886;Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + nav_lat + "," + nav_lng));                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                    startActivity(intent);

The above code can be invoked from an onClickListener linked to a Button/any other widget.

可以从链接到Button /任何其他小部件的onClickListener调用以上代码。

This brings an end to android google maps tutorial. You can download the Android GoogleMapsFeatures Project from the below link.

这结束了Android Google Maps教程。 您可以从下面的链接下载Android GoogleMapsFeatures项目。

翻译自:

免费下载谷歌maps软件

转载地址:http://bdqzd.baihongyu.com/

你可能感兴趣的文章
UIDynamic(物理仿真)
查看>>
Windows下安装Redis
查看>>
迷宫实现
查看>>
【字符编码】Java字符编码详细解答及问题探讨
查看>>
学习操作系统导图
查看>>
在线的JSON formate工具
查看>>
winform非常实用的程序退出方法!!!!!(转自博客园)
查看>>
xml解析
查看>>
centos安装vim
查看>>
linux工作调度(计划任务)
查看>>
hdu--1698 Just a Hook(线段树+区间更新+懒惰标记)
查看>>
Python学习笔记-EXCEL操作
查看>>
CListCtrlEx:一个支持文件拖放和实时监视的列表控件——用未公开API函数实现Shell实时监视...
查看>>
DirectShow实现抓图(Delphi)
查看>>
PS3 可播放的多媒体类型
查看>>
游戏开发的调试机制
查看>>
js中深拷贝代码实现
查看>>
远程获得乐趣的 Linux 命令
查看>>
Celery Flower监控,完美搞定
查看>>
完美分页
查看>>