Thursday, January 3, 2013

Percobaan Peta : Google Maps di Android

Ditulis oleh: Vogella dari http://www.vogella.com/
Disimulasikan oleh: Yusro
Perangkat Lunak: Emulator AVD 4.1.2 (Google APIs), OS. Ubuntu 12.04

-----
 
In the following chapter we will build an Android application which shows a MapView. It also shows a compass and the current geoposition. Via an ItemizedOverlay implementation we will also display the last 5 positions on the map.

Create a new Android project called "de.vogella.android.locationapi.maps" with an Activity called ShowMapActivity. Make sure to select the "Google API" as Target.

Add the following permissions to your application.
  • INTERNET
  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION


Validate that your AndroidManifest.xml file looks similiar to the following file.


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.vogella.android.locationapi.maps"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

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

        <activity
            android:name="ShowMapActivity"
            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>

</manifest>
 


Create the following MyOverlays class which extends ItemizedOverlay class.


package de.vogella.android.locationapi.maps;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.widget.Toast;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class MyOverlays extends ItemizedOverlay<OverlayItem> {

  private static int maxNum = 5;
  private OverlayItem overlays[] = new OverlayItem[maxNum];
  private int index = 0;
  private boolean full = false;
  private Context context;
  private OverlayItem previousoverlay;

  public MyOverlays(Context context, Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));
    this.context = context;
  }

  @Override
  protected OverlayItem createItem(int i) {
    return overlays[i];
  }

  @Override
  public int size() {
    if (full) {
      return overlays.length;
    } else {
      return index;
    }

  }

  public void addOverlay(OverlayItem overlay) {
    if (previousoverlay != null) {
      if (index < maxNum) {
        overlays[index] = previousoverlay;
      } else {
        index = 0;
        full = true;
        overlays[index] = previousoverlay;
      }
      index++;
      populate();
    }
    this.previousoverlay = overlay;
  }

  protected boolean onTap(int index) {
    OverlayItem overlayItem = overlays[index];
    Builder builder = new AlertDialog.Builder(context);
    builder.setMessage("This will end the activity");
    builder.setCancelable(true);
    builder.setPositiveButton("I agree", new OkOnClickListener());
    builder.setNegativeButton("No, no", new CancelOnClickListener());
    AlertDialog dialog = builder.create();
    dialog.show();
    return true;
  };

  private final class CancelOnClickListener implements
      DialogInterface.OnClickListener {
    public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(context, "You clicked yes", Toast.LENGTH_LONG)
          .show();
    }
  }

  private final class OkOnClickListener implements
      DialogInterface.OnClickListener {
    public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(context, "You clicked no", Toast.LENGTH_LONG).show();
    }
  }
}



Create a MapView key as described earlier.

Change the main.xml layout file in your res/layout folder to the following.


<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mapview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:apiKey="your_key"
    android:clickable="true" />
 
 

Replace your_key with your Google Maps API key.

Change your Activity to the following. This Activity use an LocationListner to update the MapView with the current location.


package de.vogella.android.locationapi.maps;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.OverlayItem;

public class ShowMapActivity extends MapActivity {

  private MapController mapController;
  private MapView mapView;
  private LocationManager locationManager;
  private MyOverlays itemizedoverlay;
  private MyLocationOverlay myLocationOverlay;

  public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.main); // bind the layout to the activity

    // Configure the Map
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    mapView.setSatellite(true);
    mapController = mapView.getController();
    mapController.setZoom(14); // Zoon 1 is world view
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
        0, new GeoUpdateHandler());

    myLocationOverlay = new MyLocationOverlay(this, mapView);
    mapView.getOverlays().add(myLocationOverlay);

    myLocationOverlay.runOnFirstFix(new Runnable() {
      public void run() {
        mapView.getController().animateTo(myLocationOverlay.getMyLocation());
      }
    });

    Drawable drawable = this.getResources().getDrawable(R.drawable.point);
    itemizedoverlay = new MyOverlays(this, drawable);
    createMarker();
  }

  @Override
  protected boolean isRouteDisplayed() {
    return false;
  }

  public class GeoUpdateHandler implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
      int lat = (int) (location.getLatitude() * 1E6);
      int lng = (int) (location.getLongitude() * 1E6);
      GeoPoint point = new GeoPoint(lat, lng);
      createMarker();
      mapController.animateTo(point); // mapController.setCenter(point);

    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
  }

  private void createMarker() {
    GeoPoint p = mapView.getMapCenter();
    OverlayItem overlayitem = new OverlayItem(p, "", "");
    itemizedoverlay.addOverlay(overlayitem);
    if (itemizedoverlay.size() > 0) {
      mapView.getOverlays().add(itemizedoverlay);
    }
  }

  @Override
  protected void onResume() {
    super.onResume();
    myLocationOverlay.enableMyLocation();
    myLocationOverlay.enableCompass();
  }

  @Override
  protected void onPause() {
    super.onPause();
    myLocationOverlay.disableMyLocation();
    myLocationOverlay.disableCompass();
  }
}
 
 
-------

 Thanks Prof. Vogela
Artikel Terkait

0 comments: