Привет, я немного новичок в Android, и меня хотели разработать приложение для Android, которое должно показывать текущее местоположение пользователя на карте, такой как карта Google, в автономном режиме. Могу ли я показать местоположение с помощью только GPS и без подключения к Интернету? Надо ли говорить, что эта офлайн-штука для меня жизненно важна. Любая помощь будет оценена по достоинству. Tnx заранее
Отображение текущего местоположения в автономном режиме с помощью GPS
Ответы (2)
Вы можете получить местоположение по GPS (хотя без определения местоположения вышки GSM оно будет менее точным). Однако часть карты может быть сложной. Вы можете использовать Google Maps API в своем приложении, например MapActivity, но Сама карта должна быть загружена из Интернета.
Поэтому для этого вам понадобится какое-то индивидуальное решение, возможно, от другого поставщика карт, чем Google Maps.
Возможно, вы сможете сделать это немного по-другому - получить местоположение в своем приложении, а затем открыть Google Maps с намерением, передав полученные координаты. Это должно позволить пользователю использовать любые хранящиеся в автономном режиме карты, которые у него могут быть.
(although it will be less precise without GSM tower localisation)
. Нет, совсем нет. GSM Tower очень неточен. Лучше обойтись без. Ничто не сравнится с gps.
- person greenapps; 05.12.2017
Вы можете получить необработанные данные NMEA с GPS через NmeaListener или лучше OnNmeaMessageListener (IMHO это более сложный) и проанализируйте Предложение RMC, подобное этому:
public class CustomNmeaListener implements GpsStatus.NmeaListener{
private GoogleMap mGoogleMap;
private Marker mMarkerPosition = null;
private BitmapDescriptor mMarkerMoveDescriptor;
private BitmapDescriptor mMarkerStopDescriptor;
public CustomNmeaListener(GoogleMap googleMap, int markerMoveResource, int markerStopResource){
this.mGoogleMap = googleMap;
mMarkerMoveDescriptor = BitmapDescriptorFactory.fromResource(markerMoveResource);
mMarkerStopDescriptor = BitmapDescriptorFactory.fromResource(markerStopResource);
}
@Override
public void onNmeaReceived(long timestamp, String nmea) {
double latitude;
double longitude;
float speed;
float angle;
// parse NMEA RMC sentence
// Example $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
// nmea [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]
if (nmea.startsWith("$GPRMC")) {
String[] nmeaParts = nmea.split(",");
// if RMC data valid ("active")
if (nmeaParts[2].equals("A")) {
latitude = parseLatitude(nmeaParts[3], nmeaParts[4]);
longitude = parseLongitude(nmeaParts[5], nmeaParts[6]);
speed = parseSpeed(nmeaParts[7]);
angle = parseAngle(nmeaParts[8]);
// remove marker on "old" position
if (mMarkerPosition != null) {
mMarkerPosition.remove();
}
MarkerOptions positionMarkerOptions;
if (speed > 0) {
positionMarkerOptions = new MarkerOptions()
.position(new LatLng(latitude, longitude))
.icon(mMarkerMoveDescriptor)
.anchor(0.5f, 0.5f)
.rotation(angle);
} else {
positionMarkerOptions = new MarkerOptions()
.position(new LatLng(latitude, longitude))
.icon(mMarkerStopDescriptor)
.anchor(0.5f, 0.5f)
.rotation(0);
}
mMarkerPosition = mGoogleMap.addMarker(positionMarkerOptions);
}
}
}
static float parseLatitude(String lat, String sign) {
float latitude = Float.parseFloat(lat.substring(2)) / 60.0f;
latitude += Float.parseFloat(lat.substring(0, 2));
if(sign.startsWith("S")) {
latitude = -latitude;
}
return latitude;
}
static float parseLongitude(String lon, String sign) {
float longitude = Float.parseFloat(lon.substring(3)) / 60.0f;
longitude += Float.parseFloat(lon.substring(0, 3));
if(sign.startsWith("W")) {
longitude = -longitude;
}
return longitude;
}
static float parseSpeed(String knots) {
float speed;
try {
speed = Float.parseFloat(knots);
} catch (Exception e) {
speed = 0;
}
return speed;
}
static float parseAngle(String ang) {
float angle;
try {
angle = Float.parseFloat(ang);
} catch (Exception e) {
angle = 0;
}
return angle;
}
}
и установить интервал предложения RMC на requestLocationUpdates()
вызове
try {
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
<your_update_interval>,
LOCATION_DISTANCE,
this
);
} catch (java.lang.SecurityException ex) {
Log.d(TAG, "fail to request location update, ignore", ex);
}
А для картографического сервиса вам следует использовать индивидуальное решение, потому что даже для автономных карт Google Maps требуется подключение к Интернету, по крайней мере, для проверки MAPS API KEY. В качестве первого подхода вы можете использовать простой ImageView
со снимком экрана карты.
ImageView
со снимком экрана карты.
- person Andrii Omelchenko; 05.12.2017
Can I show the location with just GPS and without Internet connection
. Ну конечно; естественно. GPS не требует интернета. И автономная карта тоже не работает. - person greenapps   schedule 05.12.2017