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.