📜  Android Google Map显示当前位置

📅  最后修改于: 2020-10-11 04:04:05             🧑  作者: Mango

Android Google Map显示当前位置

在之前的Android Google Map教程中,我们仅显示了MapsActivity.java类文件设置的默认坐标(位置)。

现在,在本教程中,我们将显示标记并将其放置在用户当前位置。为此,我们需要生成Google Map API密钥。 Android Google Map教程中介绍了生成Google Map API的过程。

为了显示用户的当前位置,我们需要实现一些接口以及回调方法。

Google Map中的回调方法

  • OnMapRreadyCallback:在MapFragment对象上设置实例时,将调用此回调接口。准备使用地图时,将调用OnMapReadyCallback接口的onMapReady(GoogleMap)方法。在onMapReady(GoogleMap)方法中,我们可以添加标记,侦听器和其他属性。
  • LocationListener:当设备位置更改时,此接口用于接收通知。位置更改后,将调用LocationListener的抽象方法onLocationChanged(Location)。
  • GoogleApiClient.ConnectionCallbacks:此接口提供onConnected(Bundle)和onConnectionSuspended(int)回调方法,在设备连接和断开连接时会调用它们。
  • GoogleApiClient.OnConnectionFailedListener:此接口提供了onConnectionFailed(ConnectionResult)回调方法,当将设备连接到服务时出错。

GoogleMap的setMyLocationEnabled()方法用于启用位置图层,该图层允许设备与当前位置进行交互。

显示当前位置的Google地图示例

让我们看一个显示设备当前位置的Google Map示例。

activity_maps.xml

在activity_maps.xml文件的片段中添加一个SupportMapFragment。


build.gradel

在build.gradel文件中添加以下依赖项。

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.google.android.gms:play-services-maps:11.8.0'
    compile 'com.google.android.gms:play-services-location:11.8.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

}

MapsActivity.java

在MapsActivity.java文件中添加以下代码。

package example.com.mapexample;


import android.os.Build;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.common.api.GoogleApiClient;
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;
import com.google.android.gms.location.LocationServices;

import android.location.Location;
import android.Manifest;
import android.content.pm.PackageManager;
import android.support.v4.content.ContextCompat;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;


public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
        LocationListener,GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener{

    private GoogleMap mMap;
    Location mLastLocation;
    Marker mCurrLocationMarker;
    GoogleApiClient mGoogleApiClient;
    LocationRequest mLocationRequest;

    @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);

    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {
                buildGoogleApiClient();
                mMap.setMyLocationEnabled(true);
            }
        }
        else {
            buildGoogleApiClient();
            mMap.setMyLocationEnabled(true);
        }

    }
    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API).build();
        mGoogleApiClient.connect();
    }

    @Override
    public 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);
        }

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onLocationChanged(Location location) {

        mLastLocation = location;
        if (mCurrLocationMarker != null) {
            mCurrLocationMarker.remove();
        }
        //Place current location marker
        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_GREEN));
        mCurrLocationMarker = mMap.addMarker(markerOptions);

        //move map camera
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(11));

        //stop location updates
        if (mGoogleApiClient != null) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
        }

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

    }

}

请求运行时权限

具有Android 6.0(棉花糖)或更高版本的Android设备需要在运行时获得某些权限才能访问设备功能。

在上面的MapsActivity.java文件中,我们添加了运行时权限Manifest.permission.ACCESS_FINE_LOCATION,该访问权限请求访问设备位置。使用checkSelfPermission()方法检查运行时权限,并返回PackageManager.PERMISSION_GRANTED或PackageManager.PERMISSION_DENIED。如果授予许可,则应用继续进行操作。

AndroidManifest.xml中的必需权限

在AndroidManifest.xml文件中添加以下用户权限。




AndroidManifest.xml



    
    
    
    


    
        
        

        
            
                

                
            
        
    


输出量