Kompass auf osmdroid Karte anzeigen

  • Antworten:20
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 146

17.04.2019, 15:20:37 via Website

Hallo zusammen

Hat Jemand Erfahrung mit der osmdroid Karte. In der Beispiel app wird ein Kompass auf der Karte gezeigt. Dieser kann man über die Optionen ein und ausschalten.

In meiner app verwende ich ebenfalls die Karte von osmdroid. Ich möchte auf meiner Karte ebenfalls ein Kompass anzeigen. Hat jemand Erfahrung mit der Karte von osmdroid und kann mir sagen, wie ich den Kompass in meiner Karte anzeigen kann?

Ich habe im wiki von osmdroid gesucht, aber nichts in dieser Richtung gefunden. Kann mir Jemand weiter helfen?

Gruss Renato

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 777

21.04.2019, 13:27:44 via Website

So hier ein Beispiel was bei mir ohne Propleme läuft.

Activity

import android.content.Context;

import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.compass.CompassOverlay;
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;

public class MainActivity extends AppCompatActivity {

MapView mapView = null;
Context ctx;
CompassOverlay compassOverlay;

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

    ctx = getApplicationContext();
    Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));


    mapView = (MapView) findViewById(R.id.map);
    mapView.setTileSource(TileSourceFactory.MAPNIK);

    compassOverlay = new CompassOverlay(ctx, new InternalCompassOrientationProvider(ctx), mapView);
    compassOverlay.enableCompass();
    mapView.getOverlays().add(compassOverlay);
}

public void onResume(){
    super.onResume();
    mapView.onResume();
}

public void onPause(){
    super.onPause();
    mapView.onPause();
}

}

Layout Datei

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

android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

Gradle File

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

implementation 'org.osmdroid:osmdroid-android:6.1.0'

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

18.04.2019, 18:00:38 via Website

Eigentlich sollte es ganz einfach sein. Gemäss Beispiel:

        compassOverlay = new CompassOverlay(getApplicationContext(), new InternalCompassOrientationProvider(getApplicationContext()), mapView);
    compassOverlay.enableCompass();

    mapView.getOverlays().add(compassOverlay);

Nur bei mir funktioniert es einfach nicht. Der Kompass wird in der Karte nicht angezeigt. Weiss jemand weiter?

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 777

18.04.2019, 19:34:21 via Website

Versuche mal

CompassOverlay mCompassOverlay = new CompassOverlay(getContext(),
new InternalCompassOrientationProvider(getContext()),
mMapView);
mCompassOverlay.enableCompass();
mMapView.getOverlays().add(this.mCompassOverlay);

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

20.04.2019, 17:45:16 via Website

Ciao Jokel

So steht es auch im Beispiel aus. Aber ich habe Probleme mit der Methode "getContext()". Die wird bei mir rot unterlegt und ich weiss nicht was ich machen muss. Muss ich was importieren oder selber was schreiben. Im Beispiel aus dem wiki ist es auch so geschrieben aber ich finde nirgends ein Hinweis auf diese öminöse Methode.

Kannst du mir da weiter helfen?

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

20.04.2019, 17:54:59 via Website

Ich habe nun folgendes ausprobiert

Import static method 'java.security.AccessController.getContext'

dann verschwindet die rote Linie vom vorderen "getContext". Aber beim zweiten Aufruf bleibt der Fehler und ich kann machen was ich will, es geht einfach nicht.

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.479

20.04.2019, 18:20:12 via Website

Ne der Context muss von einer Activity oder Fragment kommen.
Wo wird denn das ganze ausgeführt.
In einer separaten Klasse oder in einer Activity oder in einem Fragment?

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

20.04.2019, 18:25:39 via Website

Ciao Pascal

Das ganze läuft in der Activity main.

Was meinst du mit Fragment?

Gruss Renato

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.479

20.04.2019, 18:34:54 via Website

Ein Fragment ist das hier: https://developer.android.com/guide/components/fragments

In einer Activity kannst du für den Context auch 'this' nehmen:

CompassOverlay mCompassOverlay = new CompassOverlay(getContext(),
new InternalCompassOrientationProvider(this),
mMapView);
mCompassOverlay.enableCompass();
mMapView.getOverlays().add(this.mCompassOverlay);

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 777

20.04.2019, 20:17:40 via Website

Hallo also getContext benutzt man wenn man sich in einem Fragment befindet. Dachte das währe so, sorry .

Wen du in der Activity bist kannst du auch this nehmen so wie Pascal es bereits sagte.

Nur mit mit dieser zeile von Pascal denke ich ist nicht ganz richtig.
CompassOverlay mCompassOverlay = new CompassOverlay(getContext(),
new InternalCompassOrientationProvider(this),
mMapView);

Den ersten Context müsstest du auch durch this ersetzen.

CompassOverlay mCompassOverlay = new CompassOverlay(this, new InternalCompassOrientationProvider(this),
mMapView);

Bemerken möchte ich aber noch wenn du dich in eine callback Methode befinden solltest ist this meist nicht richtig.

Speicher dir den Context am besten in einer globalen Klassen Variablen setze die in der onCreate und benutze diese wenn du den Context brauchst.

Hilfreich?
Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 777

21.04.2019, 13:27:44 via Website

So hier ein Beispiel was bei mir ohne Propleme läuft.

Activity

import android.content.Context;

import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.compass.CompassOverlay;
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider;

public class MainActivity extends AppCompatActivity {

MapView mapView = null;
Context ctx;
CompassOverlay compassOverlay;

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

    ctx = getApplicationContext();
    Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));


    mapView = (MapView) findViewById(R.id.map);
    mapView.setTileSource(TileSourceFactory.MAPNIK);

    compassOverlay = new CompassOverlay(ctx, new InternalCompassOrientationProvider(ctx), mapView);
    compassOverlay.enableCompass();
    mapView.getOverlays().add(compassOverlay);
}

public void onResume(){
    super.onResume();
    mapView.onResume();
}

public void onPause(){
    super.onPause();
    mapView.onPause();
}

}

Layout Datei

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

android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

Gradle File

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

implementation 'org.osmdroid:osmdroid-android:6.1.0'

testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

21.04.2019, 17:48:31 via Website

Danke für die vielen Tips. Ich schaue sie mir alle mal in ruhe an. Was ich bereits jetzt sagen kann ist, das mit "this" funktioniert nicht. Das habe ich bereits versucht.
Nun ich habe ja da einiges zum Experimentieren. Ich melde mich wieder wenn ich mehr weis.

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

27.04.2019, 22:17:02 via Website

Mir kommt alles komisch vor. Normaler weise entwickle ich unter Linux. Da erscheint der Kompass auf keine Art und Weise. Wenn ich aber das Projekt auf einem Windows Rechner nachbaue, dann geht es.

Weiss der Kuckuck warum!

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 777

28.04.2019, 10:11:30 via Website

tesest du mit dem emulator oder ein echtes Gerät?

Emulator könnte unter linux anders sein als Windows , bei einem echten Handy solte das nicht sein.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

28.04.2019, 15:57:21 via Website

Ciao Jokel

Nein, ich teste auf einem Samsung Galaxy note 3. Gerne würde ich das Projekt von Linux auf Windows kopieren. Aber ich habe noch nicht gefunden was ich im Projekt ändern muss damit es läuft. Denn beim Kompilieren tauchen Fehler auf. Da bin ich noch daran am schauen. Vielleicht kommt es mal zum Fliegen.

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 777

28.04.2019, 16:29:06 via Website

Wo bei was kommen den Fehlermeldungen?
Bei Linux, Windows bitte genauer sonst ist Hilfe nicht möglich solltest du mittlerweile auch wissen.

Auf Linux läuft es oder wie ?
Welche Fehlermeldungen auf welchen System?
Wie hast du es übertragen ....?

— geändert am 28.04.2019, 16:32:02

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

28.04.2019, 18:23:54 via Website

Ciao Jokel

Bitte entschuldige meine Ungeduld.

Also ich habe mein Projekt von Windows nach Linux gezügelt und zwar mittels eines USB Stickt. Danach habe ich in der Datei "local.properties" den Pfad geändert. Wenn ich nun das Projekt starte kommt beim Kompilieren folgender Fehler:

/home/renato/AndroidStudioProjects/Karte/app/build/intermediates/instant_run_split_apk_resources/debug/instantRunSplitApkResourcesDebug/out/slice_0/resources_ap

Vielleicht weiss jemand was man noch am Projekt ändern muss damit man es ausführen kann.

Gruss Renato

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 777

28.04.2019, 20:02:39 via Website

Also wenn ich ein Projekt neu in as importire. Auch bei einem wo ich gar nicht weiß wo entwickl wurde.
Lösche ich immer die *.iml Dateien, local.properties, Ordner /build , /.idea .

Schaue dir mal die .gitignore Datei an in der steht welche Dateien und Ordner nicht mit in ein repository zb github übertragen werden. In solchen repositorys sind diese Dateien auch meistens nicht enthalten. Somit sollte es ohne Probleme möglich sein das Projekt in AS zu importieren.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 146

29.04.2019, 20:46:36 via Website

Ich habe mal das Projekt unter Linux neu angelegt und danach nur das Verzeichnis "src" überschrieben. Leider immer noch denselben Fehler. Ich denke, dass es wegen der "mapView" nicht geht. Mal schauen vielleicht finde ich noch den Problem.

Hilfreich?
Diskutiere mit!