Главная » Разработка для Android » Добавление карты в приложение Where Am I?

0

В следующем примере1 проект Where Am I? опять будет дополнен. На этот раз вы добавите в него картографические возможности, превратив Активность приложения в MapActivity. По мере изменения местоположения устройства карта станет автоматически центрироваться на новой позиции.

1. Начните с добавления тега <uses-permission> в манифест прило- жения для получения доступа в Интернет. Импортируйте библиотеку с картами Android в теге <application>.

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.paad.whereami">

<application android:icon="@drawable/icon">

<uses-library android:name="com.google.android.maps"/>

<activity android:name=".WhereAmI" android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

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

</intent-filter>

</activity>

</application>

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

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

</manifest>

2. Измените класс-родитель для WhereAmI на MapActivity вместо Activity.

Переопределите метод isRouteDisplayed. Поскольку эта Активность

не будет показывать  маршрут, можете вернуть значение false.

public class WhereAmI extends MapActivity {

@Override

protected boolean isRouteDisplayed() {

return false;

}

[ . . . ранее добавленный код Активности . . . ]

}

3. Отредактируйте разметку в ресурсе main.xml, включив в нее элемент

MapView  и используя при этом полное название класса. Вам нужно

1     Все фрагменты  кода в этом примере — часть проекта Where  Am I? из главы 8, их можно загрузить с сайта Wrox.com.

получить ключ к API карт, чтобы добавить атрибут android:apikey

в узел com.google.android.maps.MapView.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">

<TextView android:id="@+id/myLocationText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello"

/>

<com.google.android.maps.MapView android:id="@+id/myMapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apiKey="myMapKey"

/>

</LinearLayout>

4. Теперь при запуске приложения должны отобразиться оригинальный текст из геолокационного сервиса и MapView под ним, как показано на рис. 8.5.

Рис. 8.5.

5. Настройте MapView и сохраните ссылку на его объект MapController в виде переменной.  Установите параметры  отображения MapView, чтобы показать  спутниковые и схематичные  режимы,  а также уве- личьте масштаб, чтобы приблизить карту.

MapController mapController;

@Override

public void onCreate(Bundle savedInstance State) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

// Получите ссылку на MapView

MapView myMapView = (MapView)findViewById(R.id.myMapView);

// Получите объект MapController, принадлежащий MapView mapController = myMapView.getController();

// Настройте параметры отображения карты myMapView.setSatellite(true); myMapView.setStreetView(true); myMapView.displayZoomControls(false);

// Увеличьте масштаб mapController.setZoom(17);

LocationManager locationManager;

String context = Context.LOCATION_SERVICE;

locationManager = (LocationManager)getSystemService(context); Criteria criteria = new Criteria();

criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW);

String provider = locationManager.getBestProvider(criteria, true);

Location location =

locationManager.getLastKnownLocation(provider);

updateWithNewLocation(location);

locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);

}

6. В завершение  отредактируйте метод updateWithNewLocation, чтобы отцентрировать карту  согласно  текущему  местоположению с по- мощью MapController.

private void updateWithNewLocation(Location location) { String latLongString;

TextView myLocationText;

myLocationText = (TextView)findViewById(R.id.myLocationText);

String addressString = "No address found";

if (location != null) {

// Обновите местоположение на карте.

Double geoLat = location.getLatitude()*1E6; Double geoLng = location.getLongitude()*1E6; GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());

mapController.animateTo(point);

double lat = location.getLatitude(); double lng = location.getLongitude(); latLongString = "Lat:" + lat + "\nLong:" + lng;

double latitude = location.getLatitude();

double longitude = location.getLongitude();

1);

Geocoder gc = new Geocoder(this, Locale.getDefault());

try {

List<Address> addresses = gc.getFromLocation(latitude, longitude,

StringBuilder sb = new StringBuilder();

if (addresses.size() > 0) {

Address address = addresses.get(0);

for (int i = 0; i < address.getMaxAddressLineIndex(); i++)

sb.append(address.getAddressLine(i)).append("\n");

sb.append(address.getLocality()).append("\n"); sb.append(address.getPostalCode()).append("\n"); sb.append(address.getCountryName());

}

addressString = sb.toString();

} catch (IOException e) {}

} else {

latLongString = "No location found";

}

myLocationText.setText("Your Current Position is:\n" +

latLongString + "\n" + addressString);

}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии