kleines googlemaps problem

  • Antworten:3
Simon S
  • Forum-Beiträge: 13

16.05.2013, 11:52:27 via App

hi leute! habe ein kleines googlemaps problem, ärgere mich schon seit tagen damit rum, bekomms aber einfach nicht hin:

habe eine app geschrieben, in der man bestimmte betriebe finden kann, diese werden aus einer datenbank ausgelesen. mit googlemaps werden alle betriebe angezeigt(ganz österreich). bei meiner vorherigen app funktionierte das wunderbar, jetzt allerdings nicht mehr und ich finde den fehler einfach nicht, ist echt zum verzweifeln :(

der code allein nützt glaub ich nicht viel, darum hier das projekt: http://db.tt/Q0cGcXES
gibt bei erfolgreicher hilfe natürlich eine gegenleistung!


danke schonmal
lg sheriff

— geändert am 16.05.2013, 11:56:41

Antworten
Simon S
  • Forum-Beiträge: 13

16.05.2013, 12:03:26 via App

package kioe.first.com;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

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

public class LocationDemo2 extends MapActivity {

private static final String TAG = "**** "+LocationDemo2.class.getSimpleName();

private MapController mapController;
MapView mapView;
GeoPoint geoPoint;
boolean art;
int pFeld[];
int districtID;
double zielLat,zielLng; //geographische Breite,Länge als Parameter des Ziels
private boolean DEBUG = false;


//Buttons:
public void StartseiteKlick (View vies) {
setContentView(R.layout.startseite);
}
public void GooglemapsKlick (View vies) {
setContentView(R.layout.googlemaps);
}
public void SucheKlick (View vies) {
setContentView(R.layout.suche);
}
public void BezirkeKlick (View vies) {
setContentView(R.layout.bezirke);
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Intent in = getIntent();
art = in.getBooleanExtra("karte", false);
if (art) { //Karte mit allen Betrieben des Bezirks
districtID=in.getIntExtra("districtID",0);
pFeld = in.getIntArrayExtra("pFeld"); //Koordinaten der Betriebe
} else { //Karte mit dem aus der Liste gewählten Betrieb im Mittelpunkt
zielLat = in.getFloatExtra("lat",0);
zielLng = in.getFloatExtra("lng",0);
geoPoint = new GeoPoint((int)(zielLat*1E6), (int)(zielLng*1E6));
}
// Zoom aktivieren
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
// MapController ermitteln
mapController = mapView.getController();
} //Ende onCreate

@Override
protected void onStart() {
super.onStart();
if (!art) { //Karte nur für aus der Liste ausgewählten Betrieb
//fügt der MapView neues Overlay (zum zeichnen der 'current location') hinzu
List<Overlay> overlays = mapView.getOverlays();
// overlays.clear();
overlays.add(new MyOverlay());
} else //alle Betriebe in Karte zeichnen
multipleItems();
}

private void multipleItems() {
// mapView.setSatellite(true);

Drawable markerDefault = this.getResources().getDrawable(R.drawable.mm_20_green);
MyItemizedOverlay itemizedOverlay = new MyItemizedOverlay(markerDefault);

//für alle Betriebe ein Item aus den Koordinaten bilden und die
//where-Klausel mit der _id des Betriebes hinzufügen für onTap
for (int i=0; i<pFeld.length; i+=3) {
if (pFeld[i+1] > 0)
itemizedOverlay.addOverlayItem(pFeld[i+1],pFeld[i+2],"_id="+pFeld[i]);
}
//alle Items zur MapView hinzufügen
mapView.getOverlays().add(itemizedOverlay);
//den Mittelpunkt für den ausgewählten District heraussuchen
int lat=0,lng=0;
for (int i=0; i < Notepadv1.mpFeld.length; i+=3) {
if (Notepadv1.mpFeld[i] == districtID) {
lat = Notepadv1.mpFeld[i+1];
lng = Notepadv1.mpFeld[i+2];
//Darstellung Mittelpunkt
// itemizedOverlay.addOverlayItem(lat,lng,"",this.getResources().getDrawable(R.drawable.marker_default));
mapController.setCenter(new GeoPoint(lat,lng));
break;
}
}
if (DEBUG) {
String message="Anzahl Koord.:"+pFeld.length/3+", Mitte:"+lat+","+lng;
Log.i(TAG,message);
Toast.makeText(LocationDemo2.this, message, Toast.LENGTH_LONG).show();
}
mapController.zoomToSpan(itemizedOverlay.getLatSpanE6(), itemizedOverlay.getLonSpanE6());
}

@Override
protected void onDestroy() {
super.onDestroy();
}

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

/* a private inner class which extends Overlay and override the draw method
* http://androidcookbook.com/Recipe.seam?recipeId=1541
* zeichnet als 'overlay' den 'geoPoint' in die Karte
*/
private class MyOverlay extends com.google.android.maps.Overlay {
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
if (!shadow && geoPoint != null) {
mapController.setCenter(geoPoint);
Point point = new Point(); //wird Koordinate des GeoPoint
mapView.getProjection().toPixels(geoPoint, point);
Bitmap bmp = BitmapFactory.decodeResource(getResources(),//R.drawable.marker_default);
R.drawable.mm_20_green);
// Shift it left so the center of the image is aligned with the x-coordinate of the geo point
int x = point.x - bmp.getWidth() / 2;
// Shift it upward so the bottom of the image is aligned with the y-coordinate of the geo point
int y = point.y - bmp.getHeight();
canvas.drawBitmap(bmp, x, y, null);
}
}
}

private class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
public MyItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public void addOverlayItem(int lat, int lon, String title, Drawable altMarker) {
GeoPoint point = new GeoPoint(lat, lon);
OverlayItem overlayItem = new OverlayItem(point, title, null);
addOverlayItem(overlayItem, altMarker);
}
public void addOverlayItem(int lat, int lon, String title) {
GeoPoint point = new GeoPoint(lat, lon);
OverlayItem overlayItem = new OverlayItem(point, title, null);
addOverlayItem(overlayItem);
}
public void addOverlayItem(OverlayItem overlayItem) {
mOverlays.add(overlayItem);
populate();
}
public void addOverlayItem(OverlayItem overlayItem, Drawable altMarker) {
overlayItem.setMarker(boundCenterBottom(altMarker));
addOverlayItem(overlayItem);
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
@Override
protected boolean onTap(int index) {
if (DEBUG)
Toast.makeText(LocationDemo2.this,
getItem(index).getTitle()+", Index:"+index, Toast.LENGTH_LONG).show();
Intent in = new Intent(getApplicationContext(),Notepadv1.class);
in.putExtra("art", "where");
//_id des gewählten Listenpunktes
in.putExtra("where", getItem(index).getTitle());
//Info-Daten zum gewählten Betrieb anzeigen
startActivity(in);
return true;
}
}
public void finish() {}
public void finishAffinity() {}
}


bundesländer sind von 1-9 nummeriert, aber nur zwei werden angezeigt...

— geändert am 16.05.2013, 12:03:50

Antworten
Christian
  • Forum-Beiträge: 307

17.05.2013, 12:47:59 via Website

Hi Simon,

ich hab mir mal dein Projekt von DropBox gezogen un angesehen.
Ok wo soll ich anfangen ... mmhh

1.) Im Android Manifest fehlen folgende Angaben:
1<uses-permission android:name="android.permission.INTERNET"/>
2
3<uses-library android:name="com.google.android.maps"></uses-library>

2.) Da du dein Layout mittels setContentView wechselt ist dein ganzer Coder sehr sehr unübersichtlich. Im allgemeinen sollte jeder "Bildschirm" eine separate Activity darstellen. Ich würde vorschlagen du schaust dir noch mal den Beitrag zu Activities auf der Android Devesoper Seite an.

3.) Die Activity Notepadv1 fehlt im Manifest das führt dazu das deine Anwendung wenn man den Karten Tab klickt abstürzt.

4.) Aber auch wenn die Activity Notepadv1 eingetragen ist stürzt die Anwendung bei mir ab. Fehler: "Error copying database"
Ich vermutet mal es liegt daran das im Assets Ordner keine DB ist

Nun zum eigentlichen Problem:
Werden aus der DB auch wirklich alle Koordinaten ausgelesen?

Mfg Christian

— geändert am 17.05.2013, 12:50:55

Antworten
Simon S
  • Forum-Beiträge: 13

21.05.2013, 12:43:12 via App

danke schonmal!
ja, alle koordinaten werden ausgelesen, wenn man einige minuten wartet erscheinen alle punkte, aber wie gesagt, es gibt eine sehr lange wartezeit...

Antworten