Android osmdroid Karte in App inbinden

reqlo

Mitglied
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:
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:
<?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:
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
 

looparda

Top Contributor
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.
 

reqlo

Mitglied
Danke für die schnelle Antwort.
Die main.xml ist ein einfaches FrameLayout:
Code:
<?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:
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:
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
 

reqlo

Mitglied
Ok, ich habe jetzt herausgefunden, wie man die Version eingibt:
Code:
compile 'org.osmdroid:osmdroid-android:5.2@aar'
also ohne Klammern.

Nun bekomme ich folgende Fehlermeldung:
Code:
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
 

looparda

Top Contributor

looparda

Top Contributor
Ich habe mir mal den ganzen Kram heruntergeladen und auf das nötigste runtergebrochen:
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:
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:

reqlo

Mitglied
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
 

Neue Themen


Oben