Урок 139. Google maps. Создание и настройка проекта. Карта, камера, события

Обсуждение уроков
nikicor
Сообщения: 2
Зарегистрирован: 26 янв 2014, 16:39

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение nikicor » 24 апр 2014, 14:41

Приветствую! Ребята, помогите! На эмуляторе приложение из этого урока запускается, карты отображаются, а когда устанавливаю apk на телефон, карты не отображаются, что делать, уже все перепробовал, ничего не получается!
Изображение

saman
Сообщения: 8
Зарегистрирован: 07 апр 2014, 17:13

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение saman » 24 апр 2014, 15:29

nikicor писал(а):Приветствую! Ребята, помогите! На эмуляторе приложение из этого урока запускается, карты отображаются, а когда устанавливаю apk на телефон, карты не отображаются, что делать, уже все перепробовал, ничего не получается!
Изображение
Выше обсуждалась эта проблема, посмотрите, может, какой-то из вариантов поможет.

nikicor
Сообщения: 2
Зарегистрирован: 26 янв 2014, 16:39

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение nikicor » 24 апр 2014, 15:55

saman писал(а):
nikicor писал(а):Приветствую! Ребята, помогите! На эмуляторе приложение из этого урока запускается, карты отображаются, а когда устанавливаю apk на телефон, карты не отображаются, что делать, уже все перепробовал, ничего не получается!
Изображение
Выше обсуждалась эта проблема, посмотрите, может, какой-то из вариантов поможет.
Нет, ничего не помогло=(

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Sebler » 25 апр 2014, 03:23

Donart писал(а):
Sebler писал(а):Мне бы хотелось, чтобы как минимум, маршрут прокладывался бы моей программой самостоятельно, а не сторонними приложениями. Как это можно реализовать?
Вам сюда https://developers.google.com/maps/docu ... ons/?hl=ru
Реализация http://localhoster.blogspot.ru/2012/12/ ... -v2-4.html
В путь :)
С первой ссылкой я уже работал, а вот вторую не встречал. Спасибо. Есть ещё вопрос. Я сделал небольшой запрос маршрута и в параметрах указал travel_mode=walking, но он мне всё равно только для машины путь показывает. Т.е. как "travel_mode" : "DRIVING". Почему?
Далее пытаюсь нарисовать шаги (steps) на своей карте, и они рисуются, но прямыми линиями, а не так, как пролегает сама дорога, со всеми изгибами и т.п. Как это пофиксить, кто нибудь в курсе?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Donart » 25 апр 2014, 15:09

Sebler писал(а): Я сделал небольшой запрос маршрута и в параметрах указал travel_mode=walking, но он мне всё равно только для машины путь показывает. Т.е. как "travel_mode" : "DRIVING". Почему?
Так не скажешь, может запрос составлен неправильно, может страна. Так все работает.
Sebler писал(а): Далее пытаюсь нарисовать шаги (steps) на своей карте, и они рисуются, но прямыми линиями, а не так, как пролегает сама дорога, со всеми изгибами и т.п. Как это пофиксить, кто нибудь в курсе?
Не совсем понятно, у Вас просто прямые отрезки между точками? Вы декодируете полилинию из "points", и делаете ли это правильно?

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Sebler » 26 апр 2014, 02:23

Donart писал(а):
Sebler писал(а): Я сделал небольшой запрос маршрута и в параметрах указал travel_mode=walking, но он мне всё равно только для машины путь показывает. Т.е. как "travel_mode" : "DRIVING". Почему?
Так не скажешь, может запрос составлен неправильно, может страна. Так все работает.
Sebler писал(а): Далее пытаюсь нарисовать шаги (steps) на своей карте, и они рисуются, но прямыми линиями, а не так, как пролегает сама дорога, со всеми изгибами и т.п. Как это пофиксить, кто нибудь в курсе?
Не совсем понятно, у Вас просто прямые отрезки между точками? Вы декодируете полилинию из "points", и делаете ли это правильно?
С типом маршрута разобрался. В запросе нужно писать просто mode, а не travel_mode.
А вот на счёт "points" не понятно. Да, у меня просто прямые линии между точками. Т.е. не между начальной и конечной, а все участки пути состоят из прмых отрезков, т.е. имеем ломаную на карте.
В той статье, которую вы выше приводили я не очень разобрался, а на "points" вообще не обратил внимания, потому что не понял, что там, как и зачем декодируется. Не могли бы пояснить? Может знаете пример по-проще?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Donart » 26 апр 2014, 11:00

Sebler писал(а): Не могли бы пояснить?
Вам нужно добратся в массиве "steps" в поле "polyline" до "points". Эти "points" и есть ваш точный(с изгибами) маршрут по шагам.
[syntax=java]
List<LatLng> polyline = new ArrayList<LatLng>();
JSONArray steps = response.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONArray("steps");

// проходим по массиву steps
for (int i = 0; i < steps.length(); i++) {

JSONObject polylineObject = steps.getJSONObject(i).getJSONObject("polyline");
// на каждом шаге декодируем последовательность символов из "points" вызывая наш метод decodePoly
List<LatLng> points = decodePoly(polylineObject.getString("points"));

polyline.addAll(points); // и уже значение этого List'а polyline можете отправлять на отрисовку линии
}[/syntax]
Где-то в коде наш метод decodePoly(если в нём что-то не понятно можете закрыть глаза и не смтреть :) ). Полилиния шифруется таким обраом
[syntax=java]
private List<LatLng> decodePoly(String encoded) {
List<LatLng> poly = new ArrayList<LatLng>();
int index = 0, len = encoded.length();
int lat = 0, lng = 0;

while (index < len) {
int b, shift = 0, result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lat += dlat;

shift = 0;
result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;

LatLng p = new LatLng(lat / 1E5, lng / 1E5);
poly.add(p);
}
return poly;
}[/syntax]

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Sebler » 27 апр 2014, 00:44

Donart писал(а): Вам нужно добратся в массиве "steps" в поле "polyline" до "points". Эти "points" и есть ваш точный(с изгибами) маршрут по шагам.
Большое спасибо. Метод decodePoly() действительно страшный. Не представляю сколько времени мне бы понадобилось, если бы пришлось разбираться самому. Потом всё равно, конечно, разучу его.

Пытаюсь построить на карте маршрут с использованием общественного транспорта. Получаю путь и из джейсона беру данные объекта bounds. Далее пишу такой код:

Код: Выделить всё

map.animateCamera(CameraUpdateFactory.newLatLngBounds(mapBorder, 500, 500, 0));
В итоге получаю нужную мне часть карты, но немного обрезанную по краям. Т.е. нужно хотя бы один раз нажать на кнопку минусзум, чтобы весь путь помещался на карте. Вижу, что это связано со значениями аргументов int width, int height из метода newLatLngBounds(). Они у меня наобум выставлены в 500 и 500. Метод newLatLngBounds() с двумя аргументами, который приведён в уроке, вообще не работает. Эклипс пишет, что нужно установить размеры карты. Но что-то никак не разберусь, какие именно размеры подставить и как их корректировать относительно длины пути. И нужно ли выбирать размеры под каждое устройство. Т.е. приложение может быть запущено на смартфонах с разным размером экрана, а может вообще на планшете. Может надо как-то относительно реального разрешения устройства размер карты выставлять?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Donart » 27 апр 2014, 10:50

[syntax=java]map.animateCamera(CameraUpdateFactory.newLatLngBounds(mapBorder, 500, 500, 0));[/syntax]
Вы вызываете только метод newLatLngBounds, а в него еще надо передать объект LatLngBounds с Вашими координатами
Используйте пример из урока, передайте координаты из southwest и northeast.
[syntax=java]CameraUpdateFactory.newLatLngBounds(new LatLngBounds(new LatLng(latSouthwest, lngSouthwest), new LatLng(latNortheast, lngNortheast)), 500, 500, 100);[/syntax]
Но лучше использовать другую его реализацию без указания размера прямоугольника.
[syntax=java]CameraUpdateFactory.newLatLngBounds(new LatLngBounds(new LatLng(latSouthwest, lngSouthwest),new LatLng(latNortheast, lngNortheast)), 100);[/syntax]

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Sebler » 27 апр 2014, 14:34

Donart писал(а):
Вы вызываете только метод newLatLngBounds, а в него еще надо передать объект LatLngBounds с Вашими координатами
Используйте пример из урока, передайте координаты из southwest и northeast.
Но лучше использовать другую его реализацию без указания размера прямоугольника.
CameraUpdateFactory.newLatLngBounds(new LatLngBounds(new LatLng(latSouthwest, lngSouthwest),new LatLng(latNortheast, lngNortheast)), 100);[/syntax]
Так я всё так и делал. mapBorder это и есть LatLngBounds. Вот код:

Код: Выделить всё

		@Override
		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
			RoutePolyline rp = new RoutePolyline(httpResponse);
			
			try {
				polylinePoints = rp.getPolylinePoints();
				mapBounds = rp.getMapBounds();
			} catch (JSONException e) {
				e.printStackTrace();
			}
			map.addPolyline((new PolylineOptions().color(Color.BLUE).width(5)).addAll(polylinePoints));

			LatLngBounds mapBorder = new LatLngBounds(new LatLng(mapBounds.get("minLat"), mapBounds.get("minLon")), new LatLng(mapBounds.get("maxLat"), mapBounds.get("maxLon")));

			map.animateCamera(CameraUpdateFactory.newLatLngBounds(mapBorder, 25));

			
			Toast.makeText(MainActivity.this, "End", Toast.LENGTH_SHORT).show();
		}
Странность заключается в том, что теперь всё работает, а вчера не работало.
Когда я использовал пример из урока, т.е. без указания размеров карты, то получал ошибку с сообщением "map size should not be 0". В сети нарыл, что нужно использовать newLatLngBounds() с четырьмя аргументами, чтобы избежать этой ошибки, именно поэтому и применял его.
В любом случае, спасибо. Предстоит ещё с выбором кратчайшего пути поработать.

Sebler
Сообщения: 30
Зарегистрирован: 17 апр 2014, 17:50

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Sebler » 01 май 2014, 03:57

Снова здравствуйте. Продолжаю работать с вычислением маршрута и т.д. и тут заметил, что весь маршрут на карте одного цвета. Т.е. когда мы декодируем полилинию, то потом просто все точки разом передаются в массиве и мы их рисуем на карте. А хотелось бы, чтобы пеший путь маршрута рисовался бы другим цветом.

И ещё вопрос по парсингу джейсона. Как правильно обработать случай, когда я запрашиваю из джейсона поле или объект, а его там нет. Джейсон просто выдаёт JSONException, но если в части try я делал вызов разных объектов, то обработка будет прервана на первом же эксепшене, хотя остальные объекты может и присутствовали.
Вот пример кода:

Код: Выделить всё

			
try  {
	JSONObject bounds = route.getJSONObject("bounds");
        JSONObject bounds_southwest = bounds.getJSONObject("southwest"); 
        JSONObject bounds_northeast = bounds.getJSONObject("northeast");

	}
catch(JSONException e) {
        e.printStackTrace();
}
System.out.println(" " + bounds + " " +  bounds_southwest + " " + bounds_northeast);
Допустим объект bounds_southwest отсутствует в джейсоне. Тогда на экарне мы получим только значение объекта bounds не смотря на то, что объект bounds_northeast был в джейсоне. Как этого избежать?

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Donart » 01 май 2014, 10:42

Sebler писал(а):А хотелось бы, чтобы пеший путь маршрута рисовался бы другим цветом.
PolylineOptions().color(Color.RED)
Допустим объект bounds_southwest отсутствует в джейсоне. Тогда на экарне мы получим только значение объекта bounds не смотря на то, что объект bounds_northeast был в джейсоне. Как этого избежать?
Интересно что это за значение у bounds. Если bounds_southwest там отсутсвует, значит и bounds_northeast там нет, значит bounds = null. Если Вы использете direction API в ответе JSONa есть start_location и end_location, но нельзя посылать к direction API одну точку, изпользуйте для этого другие запросы.

Аватара пользователя
Kordan
Сообщения: 36
Зарегистрирован: 07 май 2014, 12:51

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Kordan » 07 май 2014, 13:00

Изображение
Собственно возникают такие проблемы :( .

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение klblk » 07 май 2014, 13:29

все же написано красными буквами. Ошибка в main.xml

Аватара пользователя
Kordan
Сообщения: 36
Зарегистрирован: 07 май 2014, 12:51

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Kordan » 07 май 2014, 13:43

Вот только где именно я понять не могу. В самом main ничего не выделяется, но в MainActivity ругается на R.
П.С: Проект удалил, попробую заново переделать, может упустил что.
П.П.С: При создании проекта сразу имеется куча методов и реализуется вывод надписи "Hello World". Часть из этих методов я удалял, возможно ошибки связаны именно с этим.

Аватара пользователя
Kordan
Сообщения: 36
Зарегистрирован: 07 май 2014, 12:51

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Kordan » 07 май 2014, 16:50

Пересоздал проект, внимательно прошёлся по всем пунктам. Косяков при компиляции и экспорте в апк нет, но при запуске на телефоне выдаёт что процесс внезапно остановлен.

Аватара пользователя
K0bZ0ne
Сообщения: 1
Зарегистрирован: 11 май 2014, 15:17

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение K0bZ0ne » 11 май 2014, 15:19

На девайсе стоит русский язык, соответственно все названия на картах идут на русском языке . Не подскажите, как сделать, чтобы в google maps различные названия отображались на английском языке. Заранее спасибо.

Persik
Сообщения: 19
Зарегистрирован: 15 май 2014, 08:55

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Persik » 15 май 2014, 12:47

Добрый день. Я скачала ваш проект урок 139 Google maps. Создание и настройка проекта. Карта, камера, события и решила проверить открывает ли карты. Но к сожалению не открывает карта. Есть свои проект, но почему-то выдает ошибка "Unfortunately, Google Play services has stopped." и Play store долго загружает, потом ошибка. Все перепробовала, установила кот. вы поместили http://stackoverflow.com/questions/1369 ... 2#13869332. Чего то не делала. Подскажите мне, пожалуйста. Заранее спасибо
Вложения
Мой проект  2.png
Мой проект 2.png (56.48 КБ) 8106 просмотров
Мой проект 1.png
Мой проект 1.png (63.3 КБ) 8106 просмотров
Ваш проект урок 139.png
Ваш проект урок 139.png (108.77 КБ) 8106 просмотров

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Donart » 15 май 2014, 15:18

Persik писал(а): Подскажите мне, пожалуйста.
Установлен, обновлен Google Play Services? Удалите и установите заново. Ключ правильно создали? Цитата из урока
У меня при первом запуске карта была не видна, но были видны кнопки управления масштабом. В логах был такой текст: Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors). В этом случае убедитесь, что все верно сделано с получением ключа. Если проблема остается, то удалите приложение с устройства, сделайте в Eclipse очистку проекта (меню Project > Clean) и снова установите приложение - мне помогло.
Дабы повысить шанс что Вам помогут, выкладывайте свой код и логи сюда, по скринам это делать довольно проблематично ;)

Persik
Сообщения: 19
Зарегистрирован: 15 май 2014, 08:55

Re: Урок 139. Google maps. Создание и настройка проекта. Кар

Сообщение Persik » 16 май 2014, 09:25

[quote="Donart"]Установлен, обновлен Google Play Services? Удалите и установите заново. Ключ правильно создали? Цитата из урока[/quote]

Да, установлен и обновлен Google Play Services. Я 10 раз удалила и установила. Ключ правильно написала. Незнаю, почему не показывает эмулятор.

[b]fragment_map.xml[/b]
[code]<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
android:id="@+id/btnTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickTest"
android:text="@string/test">
</Button>

<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>
</LinearLayout>[/code]

[b]MapFragment.java[/b]
[code]package kz.metroalmaty.metroapp;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnCameraChangeListener;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;

public class MapFragment extends Fragment {

SupportMapFragment mapFragment;
GoogleMap map;
final String TAG = "myLogs";

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_map, container, false);
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_map);

mapFragment = (SupportMapFragment) getFragmentManager()
.findFragmentById(R.id.map);
map = mapFragment.getMap();
if (map == null) {
finish();
return v;
}
init();
return v;
}

private void finish() {
// TODO Auto-generated method stub

}

private void init() {
map.setOnMapClickListener(new OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
Log.d(TAG, "onMapClick: " + latLng.latitude + "," + latLng.longitude);
}
});

map.setOnMapLongClickListener(new OnMapLongClickListener() {

@Override
public void onMapLongClick(LatLng latLng) {
Log.d(TAG, "onMapLongClick: " + latLng.latitude + "," + latLng.longitude);
}
});

map.setOnCameraChangeListener(new OnCameraChangeListener() {

@Override
public void onCameraChange(CameraPosition camera) {
Log.d(TAG, "onCameraChange: " + camera.target.latitude + "," + camera.target.longitude);
}
});

}


public void onClickTest(View view) {
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(-27, 133))
.zoom(5)
.bearing(45)
.tilt(20)
.build();
CameraUpdate cameraUpdate = CameraUpdateFactory.newCameraPosition(cameraPosition);
map.animateCamera(cameraUpdate);

}


private void setContentView(int fragmentMap) {
// TODO Auto-generated method stub

}
final MapView mMapView = (MapView) findViewById(R.id.map);
MapController mMapController = mMapView.getMapController();
mMapController.setPositionAnimationTo(new GeoPoint(60.113337, 55.151317));
mMapController.setZoomCurrent(15);
}
[/code]

[b]AndroidManifest.xml[/b]
[code]<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kz.metroalmaty.metroapp"
android:versionCode="1"
android:versionName="1.0" >



<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

<uses-feature
android:glEsVersion="0x00020000"
android:required="true">
</uses-feature>


<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />



<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >



<activity
android:name="kz.metroalmaty.metroapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".ScheduleAllActivity"
android:label="@string/title_schedule_all"
android:parentActivityName="kz.metroalmaty.metroapp.MainActivity">
<meta-data android:name="android.support.PARENT_ACTIVITY"
android:value="kz.metroalmaty.metroapp.MainActivity"/>
</activity>
<activity android:name="StationsActivity"></activity>
<activity android:name="Raiyimbek_batirActivity"></activity>
<activity android:name="PaymentActivity"></activity>
<activity android:name="Zhibek_zholiActivity"></activity>
<activity android:name="AlmaliActivity"></activity>
<activity android:name="AbaiaActivity"></activity>
<activity android:name="BaiykonirActivity"></activity>
<activity android:name="AuezovaActivity"></activity>
<activity android:name="AlatayActivity"></activity>


<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyD31JQ3zKL4U8RzlqLhWjGZXk2pEYwSTDY">
</meta-data>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version">
</meta-data>

</application>

</manifest>
[/code]
Последний раз редактировалось Persik 19 май 2014, 05:55, всего редактировалось 1 раз.

Ответить