Android osmdroid Karte in App inbinden

Dieses Thema Android - osmdroid Karte in App inbinden im Forum "Mobile Geräte" wurde erstellt von reqlo, 31. Okt. 2016.

Thema: osmdroid Karte in App inbinden Hallo, vielleicht kann mir hier jemand bei meinem Problem helfen. Ich möchte eine App unter Verwendung von Open...

  1. Hallo,
    vielleicht kann mir hier jemand bei meinem Problem helfen. Ich möchte eine App unter Verwendung von Open Streat Maps programmieren. Im Moment scheitert es schon daran, dass mir die Karte nicht angezeigt wird sondern nur ein graues Gittermuster.
    Ich habe folgenden Code in Android Studio:

    Code (Text):
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.ViewGroup;

    import org.osmdroid.DefaultResourceProxyImpl;
    import org.osmdroid.util.GeoPoint;
    import org.osmdroid.views.MapView;
    import org.osmdroid.views.overlay.MyLocationOverlay;
    import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;

    public class Main extends AppCompatActivity {

        private MapView mapView;
        private MyLocationOverlay myLocationOverlay;

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

            mapView = new MapView(this,256, new DefaultResourceProxyImpl(this));
            mapView.setBuiltInZoomControls(true);
            mapView.setMultiTouchControls(true);
            mapView.getController().setZoom(16);
            mapView.getController().setCenter(new GeoPoint(52.221, 6.893));

            ViewGroup container = (ViewGroup)findViewById(R.id.container);
            container.addView(mapView);

            myLocationOverlay = new MyLocationOverlay(getApplicationContext(),mapView);
            myLocationOverlay.enableMyLocation();
            mapView.getOverlays().add(myLocationOverlay);
        }
    }
    Mein Manifest:
    Code (Text):

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.lothar.karte">




        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".Main">
                <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.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    </manifest>
     
    und mein build:
    Code (Text):

    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"

        defaultConfig {
            applicationId "com.example.lothar.karte"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.1.1'
        compile files('libs/slf4j-android-1.5.8.jar')
        compile files('libs/osmdroid-android-4.2.jar')
    }
     
    Die .jar-dateien aus den dependencies stehen im libs-Ordner

    mfg
    reqlo
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Versuch mal diese Anleitung mit aktueller Version (oder musst du diese spezielle Version benutzen?). Du musst die Library nicht manuell nach libs laden. Das macht gradle für dich, wenn du es wie in HowToGradle angibst (Version ersetzen, aktuell wohl 5.5).
    https://github.com/osmdroid/osmdroid/wiki/How-to-use-the-osmdroid-library
    Falls es nicht funktioniert zeig nochmal deine activity_main.xml oder versuche statt der Karte erstmal Text in den View zu laden um sicherzustellen, dass der Austausch des container contents prinzipiell funktioniert.
     
  4. Danke für die schnelle Antwort.
    Die main.xml ist ein einfaches FrameLayout:
    Code (Text):

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.lothar.karte.Main">
    </FrameLayout>
     
    Das "HowToGradle" habe ich auch schon gesehen. Ich wusste nur nicht, wie man die Version reinschreibt. Ich habe jetzt folgendes versucht:
    Code (Text):

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.1.1'
        //compile files('libs/slf4j-android-1.5.8.jar')
        //compile files('libs/osmdroid-android-4.0.jar')
        compile 'org.osmdroid:osmdroid-android:(4.0):release@aar'
    }
     
    Ich brauche keine bestimmte Version, ich habe es auch mit 5.5, 5.1 probiert. Ich bekomme folgende Fehlermeldung:
    Code (Text):

    Error:A problem occurred configuring project ':app'.
    > Could not resolve all dependencies for configuration ':app:_debugCompile'.
      > Could not find org.osmdroid:osmdroid-android:(4.0).
      Searched in the following locations:
      https://jcenter.bintray.com/org/osmdroid/osmdroid-android/(4.0)/osmdroid-android-(4.0).pom
      https://jcenter.bintray.com/org/osmdroid/osmdroid-android/(4.0)/osmdroid-android-(4.0)-release.aar
      file:/C:/Users/Lothar/AppData/Local/Android/sdk1/extras/android/m2repository/org/osmdroid/osmdroid-android/(4.0)/osmdroid-android-(4.0).pom
      file:/C:/Users/Lothar/AppData/Local/Android/sdk1/extras/android/m2repository/org/osmdroid/osmdroid-android/(4.0)/osmdroid-android-(4.0)-release.aar
      file:/C:/Users/Lothar/AppData/Local/Android/sdk1/extras/google/m2repository/org/osmdroid/osmdroid-android/(4.0)/osmdroid-android-(4.0).pom
      file:/C:/Users/Lothar/AppData/Local/Android/sdk1/extras/google/m2repository/org/osmdroid/osmdroid-android/(4.0)/osmdroid-android-(4.0)-release.aar
      Required by:
      Karte:app:unspecified
     
    Ich nehme an, die Version ist falsch eingetragen, denn Gradle sucht auf der richtigen Seite.

    mfg
    reqlo
     
  5. Ok, ich habe jetzt herausgefunden, wie man die Version eingibt:
    Code (Text):

    compile 'org.osmdroid:osmdroid-android:5.2@aar'
     
    also ohne Klammern.

    Nun bekomme ich folgende Fehlermeldung:
    Code (Text):

    Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
    > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.7.0_45\bin\java.exe'' finished with non-zero exit value 2
     
     
  6. Ich habe mir mal den ganzen Kram heruntergeladen und auf das nötigste runtergebrochen:
    Code (Java):
    public class Main extends AppCompatActivity {

        private MapView mapView;
        //private MyLocationOverlay myLocationOverlay;


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

            mapView = new MapView(this);
            mapView.setBuiltInZoomControls(true);
            mapView.setMultiTouchControls(true);
            mapView.getController().setZoom(16);
            mapView.getController().setCenter(new GeoPoint(52.221, 6.893));

            ViewGroup container = (ViewGroup)findViewById(R.id.container);
            container.addView(mapView);
        }
     
    Ich habe auch den Fehler bekommen aber konnte ihn durch
    Code (Text):

    multiDexEnabled true
     
    beheben. Was das jetzt macht weiß ich allerdingt nicht.
    Danach habe ich die App auf dem Handy ausgeführt. Ich habe auch ein graues Grid bekommen. Seit Android 5 muss man ja explizit die Berechtigung für Dienste erteilen. Also bin ich in die Berechtigungen der App gegangen und habe die Berechtigung für Speicher und Standort aktiviert. Und somit wurde die Karte angezeigt. Diese Rechte solltest du in deiner App einfach vom User anfragen. Wichtig scheint laut der Hilfeseite noch zu sein den user-agent zu setzen, damit du nicht vom osm service ausgesperrt wirst.
    Außerdem ist mir aufgefallen, dass du FrameLayout das zum einhängen von Fragmenten ist nicht wirklich benutzt.. außerdem müsstest du dann auch eine FragmentActivity benutzen, denke ich. FrameLayout ist zum einhängen eines einzigen Views wohl korrekt.
     
    Zuletzt bearbeitet: 1. Nov. 2016
  7. Danke looparda, mit deiner Hilfe habe ich es nach Überwindung einiger weiterer Hürden geschafft. :)
    Ich habe nun auch ein LineaLayout genommen, ich hatte mir vorher ehrlich gesagt keine Gedanken darüber gemacht.

    mfg
    reqlo
     
  8. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!