#java #android #google-maps
#java #Android #google-карты
Вопрос:
Я попытался создать приложение, в котором есть действие с картой, которое, как только оно открывается, карта начинается с текущего местоположения пользователя. Я пытался использовать руководства и онлайн-справку, но, похоже, все эти руководства устарели, потому что по умолчанию в активности maps у них есть методы onResume и OnStart, а вместо этого у меня есть метод onMapReady и ни один из этих методов. это код, который я пытался написать, но он не работает (сбой приложения),
package com.imt.civilwatch;
import android.content.pm.PackageManager;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.common.ConnectionResu<
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
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;
import java.text.StringCharacterIterator;
public class MapActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private GoogleMap mMap;
protected GoogleApiClient mGoogleApiClient;
Location mLastLocation;
private double mLatitudeText;
private double mLongitudeText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
// 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);
}
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(32, 35);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
//mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
@Override
public void onConnected(Bundle connectionHint) {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; 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;
}
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null) {
mLatitudeText = (Double.valueOf(mLastLocation.getLatitude()));
mLongitudeText = (Double.valueOf(mLastLocation.getLongitude()));
LatLng last = new LatLng( mLatitudeText,mLongitudeText);
mMap.moveCamera(CameraUpdateFactory.newLatLng(last));
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
}
Комментарии:
1. Если у вас сбой приложения, пожалуйста, укажите logcat в своих вопросах
Ответ №1:
Из документации Google Maps Android API данные о местоположении, доступные для устройства Android, включают в себя текущее местоположение устройства, определенное с помощью комбинации технологий — направление и способ перемещения, а также то, пересекло ли устройство предопределенную географическую границу или геозону.
В зависимости от потребностей вашего приложения вы можете выбрать один из этих вариантов:
- Использование слоя My Location, который обеспечивает простой способ отображения местоположения устройства на карте. Он не предоставляет данные.
- Для всех программных запросов данных о местоположении рекомендуется использовать Google Play services Location API.
- А использование интерфейса LocationSource позволяет вам указать настраиваемого поставщика местоположения.
Комментарии:
1. спасибо вам, ребята, за обратную связь, вы действительно помогли. руководство, на которое вы ссылались, было действительно полезным, и благодаря этому мой код наконец-то заработал!
Ответ №2:
Метод onMapReady запускается, когда фрагмент карты готов и отображает карту.
Метод OnConnected запускается, когда устройство успешно подключается к службе определения местоположения Google Play и (если доступно) получает ваше последнее известное местоположение.
Если вы не хотите, чтобы камера перемещалась в ваше текущее местоположение, удалите что между этим условием:
if(mLastLocation != null){...}
Для карт камера — это то, что видно на экране. Метод mMap.moveCamera(…) указывает карте центрировать изображение на определенном расстоянии.
Если ваша карта будет готова до того, как ваш телефон подключится к Google Play Location API, текущее местоположение будет отображаться следующим образом:
if (mLastLocation != null) {
mLatitudeText = (Double.valueOf(mLastLocation.getLatitude()));
mLongitudeText = (Double.valueOf(mLastLocation.getLongitude()));
LatLng last = new LatLng( mLatitudeText,mLongitudeText);
mMap.moveCamera(CameraUpdateFactory.newLatLng(last));
}
Надеюсь, я был ясен.
Смотрите Документы CameraFactory, чтобы узнать о работе с камерой на Картах: https://developers.google.com/android/reference/com/google/android/gms/maps/CameraUpdateFactory
Ответ №3:
Братан, для этого тебе нужны GoogleApiClient и LocationRequest , а также в манифесте два разрешения пользователей: «ДОСТУП К ТОЧНОМУ МЕСТОПОЛОЖЕНИЮ И ДОСТУП К ГРУБОМУ МЕСТОПОЛОЖЕНИЮ», и чтобы получить текущее местоположение, вам нужно сделать что-то вроде этого: включить это в манифест:-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
—> И текущий код местоположения в Acticity будет выглядеть следующим образом:
—> Создайте эти две переменные глобально в действии:
GoogleApiClient mGoogleapiClient;
LocationRequest mUserLocationRequest;
—> Затем перейдите к @override Onconnected() и сделайте вот так :-
@Override
public void onConnected(Bundle bundle) {
mUserLocationRequest = LocationRequest.create();
/* Priority = High so that more Correct User Location will be Accessed
up to date information ot highest information get*/
/* Priority = Low if you Don't Want The Exect Location Of The User */
mUserLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
/*For every 1 min I have to Fetch My User Location*/
mUserLocationRequest.setInterval(1000);
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleapiClient, mUserLocationRequest, (LocationListener) MainActivity.this);
}
—> Теперь запускает LocationListener в Activity, который внедряет метод onLocationChanged(): и делайте в этом такие вещи, которые будут предоставлять вам актуальную информацию всякий раз, когда пользователь меняет свое местоположение:-
@Override
public void onLocationChanged(Location location) {
if (location == null)
{
Toast.makeText(this, "Sorry We Can't able to Get Your Current Location", Toast.LENGTH_SHORT).show();
}
else
{
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng,15);
mGoogleMap.animateCamera(update);
}
}