API Google Maps Android V2 Збільшити до поточного місцезнаходження


74

Я намагаюся возитися з Maps API V2, щоб ознайомитися з ним, і намагаюся запустити карту з центром у поточному місцезнаходженні користувача. Використовуючи map.setMyLocationEnabled(true);заяву, я можу показати своє поточне місцезнаходження на карті. Це також додає кнопку до інтерфейсу, який центрує карту за моїм поточним місцезнаходженням.

Я хочу імітувати натискання кнопки у своєму коді. Я знайомий з LocationManagerі LocationListenerкласів і зрозуміти , що з допомогою тих , хто є життєздатною альтернативою, але функціональність до центру і натисніть на місце розташування користувача , здається, вже побудований через кнопку.

Якщо API має метод, щоб показати поточне місцезнаходження користувача, безумовно, повинен бути простіший спосіб зосередити місце на місці, ніж використовувати LocationManager/ LocationListenerкласи, правда?


Основним моментом тут є отримання геокоординат поточного місцезнаходження. Ви можете використовувати GPS-бібліотеку, щоб отримати це. Після того, як ви отримали геокоординати, це тривіально. Направити наступні для отримання більш докладної інформації: stackoverflow.com/questions/17519198 / ...
user846316

Відповіді:


111

Спробуйте це кодування:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();

Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
if (location != null)
{
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 13));

    CameraPosition cameraPosition = new CameraPosition.Builder()
        .target(new LatLng(location.getLatitude(), location.getLongitude()))      // Sets the center of the map to location user
        .zoom(17)                   // Sets the zoom
        .bearing(90)                // Sets the orientation of the camera to east
        .tilt(40)                   // Sets the tilt of the camera to 30 degrees
        .build();                   // Creates a CameraPosition from the builder
    map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));       
}

1
а якщо місце розташування == нуль..Будь ласка, допоможіть
jyomin

@jyomin Перевірте тут мою відповідь про те, як отримати місцезнаходження користувача. Він використовує вищевказаний метод з невеликою безпекою для перевірки наступного найкращого можливого місцезнаходження користувача. stackoverflow.com/a/14511032/845038 Це може виправити отримання нуля, перевіривши наступне найкраще розташування.
DMCApps,

1
Це рішення просте і просто працює. Дякую.
Енкк

Це не працює для мене на android 4.2.1, але працює на моєму планшеті nexus 7 з android 5. чи не могли б ви допомогти з цим?
farid bekran

The Google Play services location APIs are preferred over the Android framework location APIs (android.location) as a way of adding location awareness to your app.Цей метод є старим. Будь ласка, перевірте developer.android.com/training/location/index.html
Гохан Арік

45

Після інстансування об'єкта карти (з фрагмента) додайте це -

private void centerMapOnMyLocation() {

    map.setMyLocationEnabled(true);

    location = map.getMyLocation();

    if (location != null) {
        myLocation = new LatLng(location.getLatitude(),
                location.getLongitude());
    }
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation,
            Constants.MAP_ZOOM));
}

якщо вам потрібні будь-які вказівки, просто запитайте, але це повинно бути зрозумілим - просто інстансуйте об'єкт myLocation за типовим ...


1
У мене така сама проблема, але коли я намагаюся використовувати map.getMyLocation (), це попереджає мене, що цей метод застарілий. Яким буде правильний спосіб зробити це зараз?
Пем

15
"getMyLocation () Цей метод застарілий. Натомість використовуйте LocationClient. LocationClient забезпечує покращений пошук місцеположення та енергоспоживання. Він використовується синьою крапкою" Моє місце розташування ". Див. Путівник ". (взято з сайту розробника android) Наступного разу просто прочитайте API, якщо щось застаріло, це буде заміною
crazyPixel

5
LocationClient позначено як застарілий. Натомість вам слід використовувати LocationServices
Ларс Нільсен,

Я думаю, Constants.MAP_ZOOM повинен бути визначеним нами рівнем масштабування?
AgentKnopf

@Zainodis ти вгадав правильно. Як правило великого пальця, коли я пишу щось, що залежить від деяких попередніх даних або даних, які слід отримати, я ініціюю це для певного значення за замовчуванням.
crazyPixel

18
youmap.animateCamera(CameraUpdateFactory.newLatLngZoom(currentlocation, 16));

16 - рівень масштабування


1
Але як я можу отримати currentLocation без використання LocationManager та LocationListener? Або це неможливо?
user139260

наскільки мені відомо, це неможливо. і я пропоную вам не використовувати менеджер місцезнаходжень. Клієнт локації користувача, який відрізняється високою точністю та низьким енергоспоживанням батареї, а також простий у реалізації developer.android.com/google/play-services/location.html нещодавно запущений google
SHASHIDHAR MANCHUKONDA

1
Місце розташування = map.getMyLocation (); map - об’єкт GoogleMap
Venkat

1
Це рішення просте і чарівне
Satheesh

замість 16 ви можете використовувати 14.0f
Даніш Шерма

16
    mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(Location location) {

                CameraUpdate center=CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(), location.getLongitude()));
                CameraUpdate zoom=CameraUpdateFactory.zoomTo(11);
                mMap.moveCamera(center);
                mMap.animateCamera(zoom);

        }
    });

2
На жаль, цей метод зараз застарів :(
Антоніо

1
І якщо ви прокрутите подалі від свого місцезнаходження, через кілька секунд ви повернетесь до свого поточного місцезнаходження, оскільки ваше місцезнаходження щойно оновилося.
Джеффрі Лю

10

спробуйте цей код:

private GoogleMap mMap;


LocationManager locationManager;


private static final String TAG = "";

@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(map);
    mapFragment.getMapAsync(this);

    arrayPoints = new ArrayList<LatLng>();
}

@Override
public void onMapReady(GoogleMap googleMap) {


    mMap = googleMap;


    mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);


    LatLng myPosition;


    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;
    }
    googleMap.setMyLocationEnabled(true);
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    String provider = locationManager.getBestProvider(criteria, true);
    Location location = locationManager.getLastKnownLocation(provider);


    if (location != null) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        LatLng latLng = new LatLng(latitude, longitude);
        myPosition = new LatLng(latitude, longitude);


        LatLng coordinate = new LatLng(latitude, longitude);
        CameraUpdate yourLocation = CameraUpdateFactory.newLatLngZoom(coordinate, 19);
        mMap.animateCamera(yourLocation);
    }
}

}

Не забудьте додати дозволи на AndroidManifest.xml.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

1
Ласкаво просимо до Stack Overflow! Хоча цей фрагмент коду може відповісти на запитання, краще включити опис того, в чому була проблема, і те, як ваш код вирішить дану проблему. В майбутньому, ось деяка інформація, як зламати дивовижну відповідь на переповнення стека: stackoverflow.com/help/how-to-answer
dirtydanee

4
private void setUpMapIfNeeded(){
    if (mMap == null){
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();//invoke of map fragment by id from main xml file

     if (mMap != null) {
         mMap.setMyLocationEnabled(true);//Makes the users current location visible by displaying a blue dot.

         LocationManager lm=(LocationManager)getSystemService(LOCATION_SERVICE);//use of location services by firstly defining location manager.
         String provider=lm.getBestProvider(new Criteria(), true);

         if(provider==null){
             onProviderDisabled(provider);
              }
         Location loc=lm.getLastKnownLocation(provider);


         if (loc!=null){
             onLocationChanged(loc);
      }
         }
     }
}

    // Initialize map options. For example:
    // mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

@Override
public void onLocationChanged(Location location) {

   LatLng latlng=new LatLng(location.getLatitude(),location.getLongitude());// This methods gets the users current longitude and latitude.

    mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng));//Moves the camera to users current longitude and latitude
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latlng,(float) 14.6));//Animates camera and zooms to preferred state on the user's current location.
}

    // TODO Auto-generated method stub


Будь ласка, додайте пояснення щодо того, що робить ваш код і як він відповідає на запитання, і, будь ласка, відформатуйте його належним чином. Перетворіть вкладки в пробіли перед копіюванням коду в SO, оскільки вкладки часто не відображаються належним чином.
Аді Інбар

Вищевказане рішення завантажує фрагмент карти і показує відцентровану позицію поточного місцезнаходження користувачів із використанням бажаного рівня масштабування, в цьому випадку мій був (14.6) @AdiInbar
Imm3000

Будь ласка, включіть пояснення у відповідь, а не відповідайте у коментарях, і відформатуйте код. (FYI, я не запитував з особистого інтересу. Я натрапив на вашу відповідь в черзі огляду низькоякісних повідомлень і радив вам її покращити, щоб уникнути подальших голосів проти і видалити голоси.)
Аді Інбар,

3

Ось як це зробити всередині ViewModelі FusedLocationProviderClient, код в Kotlin

locationClient.lastLocation.addOnSuccessListener { location: Location? ->
            location?.let {
                val position = CameraPosition.Builder()
                        .target(LatLng(it.latitude, it.longitude))
                        .zoom(15.0f)
                        .build()
                map.animateCamera(CameraUpdateFactory.newCameraPosition(position))
            }
        }

Це доцільно? Переслідуючи кілька предметів, як locationClient.lastLocation.addOnSuccessListener{}?
Ssenyonjo

2

Це працює Поточне місцезнаходження зі збільшенням для Google Map V2

 double lat= location.getLatitude();
 double lng = location.getLongitude();
 LatLng ll = new LatLng(lat, lng);
 googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(ll, 20));

3
locationвикидає помилку:Can not resolute symbol 'location'
Бекка

Запитати, як отримати поточні координати місця розташування , і відповідь тут: stackoverflow.com/a/17519248/846316
user846316

2

заціни:

    fun requestMyGpsLocation(context: Context, callback: (location: Location) -> Unit) {
        val request = LocationRequest()
        //        request.interval = 10000
        //        request.fastestInterval = 5000
        request.numUpdates = 1
        request.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        val client = LocationServices.getFusedLocationProviderClient(context)

        val permission = ContextCompat.checkSelfPermission(context,
            Manifest.permission.ACCESS_FINE_LOCATION )
        if (permission == PackageManager.PERMISSION_GRANTED) {
            client.requestLocationUpdates(request, object : LocationCallback() {
                override fun onLocationResult(locationResult: LocationResult?) {
                val location = locationResult?.lastLocation
                if (location != null)
                    callback.invoke(location)
            }
         }, null)
       }
     }

і

    fun zoomOnMe() {
        requestMyGpsLocation(this) { location ->
            mMap?.animateCamera(CameraUpdateFactory.newLatLngZoom(
                LatLng(location.latitude,location.longitude ), 13F ))
        }
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.