确定android中的用户位置

时间:2016-09-22 15:59:31

标签: android google-maps-android-api-2 android-gps

我是Android的初学者,我正在努力学习android。我正在尝试创建一个使用谷歌地图识别用户位置的Android应用程序。但是,我能够识别用户的位置,但不是我预期的。

如下图所示,它显示了默认位置。单击左上角的按钮后,地图会显示我的位置。

enter image description here

我想直接了解我的位置,而无需点击按钮。此外,我想知道用户位置并将其存储在字符串中,而不是经度和纬度值。任何帮助?

代码:

package com.example.lalinda.googlemap1;

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

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.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @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;
        mMap.setMyLocationEnabled(true);
    }
}

1 个答案:

答案 0 :(得分:1)

Google地图使用用户lastKnownLocation作为位置,如果lastknownLocation未知,则需要时间通过不同的提供商GPSNetwork获取位置。我建议使用lastKnownLocation作为基本位置,并使用LocationListener更新它。

       @Override
       public void onMapReady(GoogleMap googleMap) { 
       if (ActivityCompat.checkSelfPermission
                (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                &&
                ActivityCompat.checkSelfPermission
                        (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
        {
            requestPermissions(new String[]{
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION
            }, 1);

        }
        else {

            // enable location buttons
            googleMap.setMyLocationEnabled(true);
            googleMap.getUiSettings().setMyLocationButtonEnabled(true);

            // fetch last location if any from provider - GPS.
            final LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            final Location loc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            //if last known location is not available
            if (loc == null) {

                final LocationListener locationListener = new LocationListener() {
                    @Override
                    public void onLocationChanged(final Location location) {
                        clearMap(googleMap); // clear map for every new location to update your marker unless `n` number of markers will form.
                        // getting location of user
                        final double latitude = location.getLatitude();
                        final double longitude = location.getLongitude();
                        final LatLng userCurrentLocation = new LatLng(latitude, longitude);
                        //focus added here **edited**
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userCurrentLocation, 14));

                        googleMap.addMarker(new MarkerOptions()
                       .position(userCurrentLocation)
                       .draggable(true)
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_marker_icon_from_deawable)));
                        //do something with Lat and Lng, Parse to String if u want or set marker.

                    }

                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {
                    }

                    @Override
                    public void onProviderEnabled(String provider) {
                        //when user enables the GPS setting, this method is triggered.
                    }

                    @Override
                    public void onProviderDisabled(String provider) {
                        //when no provider is available in this case GPS provider, trigger your gpsDialog here.
                    }
                };

                //update location every 10sec in 500m radius with both provider GPS and Network.

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10*1000, 500, locationListener);
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 500, locationListener);
            }
            else {
                //do something with last known location.
                // getting location of user
                final double latitude = loc.getLatitude();
                final double longitude = loc.getLongitude();
                final LatLng userCurrentLocation = new LatLng(latitude, longitude);

                //focus added here **edited**
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userCurrentLocation, 14));

                googleMap.addMarker(new MarkerOptions()
                .position(userCurrentLocation)
                .draggable(true)
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_marker_icon_from_deawable)));
            }
           }
        }

许可处理:

     @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {

        case 1:
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
                //do something
            }
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

此示例仅用于演示(示例目的),我没有使用方法优化我的代码。请在将来编辑。