I’ve also tried to use the gtfs reader in an android app. As initial project I’ve used the android project from the graphhopper repository and changed the following things (this guide isn’t completed yet). I’ve forked the repository and you can find all my changes here: https://github.com/RaimundWege/graphhopper/commit/d22715e880694a6407c6d657357a39ea046172ef
1.) In the build.gradle of the android project add two repositories to resolve the missing dependencies (the order of the repositories is important).
2.) In the build.gradle of the app module you need to:
set the ‘minSdkVersion’ and ‘targetSdkVersion’ to at least ‘26’,
set ‘minifyEnabled’ to ‘false’,
add the property ‘multiDexEnabled’ and set ‘true’ as value,
enable java version 1.8,
add the graphhopper-gtfs depenceny,
and the android support multidex dependency:
android {
// ...
defaultConfig {
// ...
minSdkVersion 26
targetSdkVersion 26
}
buildTypes {
all {
// ...
minifyEnabled false
multiDexEnabled true
}
}
// ...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
// ...
dependencies {
// ...
implementation 'Sorry, new users can only put 2 links in a post.'
implementation 'Sorry, new users can only put 2 links in a post.'
}
3.) In the android manifest you need to add the permission to read from an external storage.
4.) Also in the android manifest you need to add the android:hardwareAccelerated=“true” and the android:largeHeap=“true” application attribute.
5.) In the MainActivity replace the doInBackground method of the loadGraphStorageMethod to (‘my-gtfs.zip’ is the uploaded feed):
protected Path saveDoInBackground(Void... v) throws Exception {
String path = new File(mapsFolder, currentArea).getAbsolutePath() + "-gh";
final PtFlagEncoder ptFlagEncoder = new PtFlagEncoder();
final FootFlagEncoder footFlagEncoder = new FootFlagEncoder();
final CarFlagEncoder carFlagEncoder = new CarFlagEncoder();
EncodingManager encodingManager = new EncodingManager(Arrays.asList(ptFlagEncoder, footFlagEncoder, carFlagEncoder), 8);
GHDirectory directory = GraphHopperGtfs.createGHDirectory(mapsFolder.getAbsolutePath() + "/graph-cache");
GtfsStorage gtfsStorage = GraphHopperGtfs.createGtfsStorage();
GraphHopperStorage graphHopperStorage = GraphHopperGtfs.createOrLoad(directory, encodingManager, ptFlagEncoder, gtfsStorage, Collections.singleton(path + "/my-gtfs.zip"), Collections.<String>emptyList());
LocationIndex locationIndex = GraphHopperGtfs.createOrLoadIndex(directory, graphHopperStorage);
GraphHopperGtfs tmpHopp = GraphHopperGtfs.createFactory(ptFlagEncoder, GraphHopperGtfs.createTranslationMap(), graphHopperStorage, locationIndex, gtfsStorage).createWithoutRealtimeFeed();
tmpHopp.load(path);
hopper = tmpHopp;
return null;
}
6.) When I run the app now it fails after a while with the error ‘Could not instantiate class’ which is raised in the mapdb dependency…
Error Log:
10-10 15:37:20.329 9345-9345/com.graphhopper.android W/System.err: java.lang.RuntimeException: Could not instantiate class
10-10 15:37:20.330 9345-9345/com.graphhopper.android W/System.err: at org.mapdb.SerializerPojo.deserializeUnknownHeader(SerializerPojo.java:483)
at org.mapdb.SerializerBase.deserialize3(SerializerBase.java:1216)
at org.mapdb.SerializerBase.deserialize(SerializerBase.java:1132)
at org.mapdb.SerializerBase.deserialize(SerializerBase.java:867)
at org.mapdb.SerializerPojo.deserialize(SerializerPojo.java:701)
at org.mapdb.HTreeMap$2.deserialize(HTreeMap.java:135)
at org.mapdb.HTreeMap$2.deserialize(HTreeMap.java:121)
at org.mapdb.Store.deserialize(Store.java:297)
at org.mapdb.StoreDirect.get2(StoreDirect.java:486)
at org.mapdb.StoreDirect.get(StoreDirect.java:439)
at org.mapdb.EngineWrapper.get(EngineWrapper.java:58)
at org.mapdb.AsyncWriteEngine.get(AsyncWriteEngine.java:333)
at org.mapdb.Caches$HashTable.get(Caches.java:246)
at org.mapdb.HTreeMap.getInner(HTreeMap.java:458)
10-10 15:37:20.331 9345-9345/com.graphhopper.android W/System.err: at org.mapdb.HTreeMap.getPeek(HTreeMap.java:436)
at org.mapdb.HTreeMap.containsKey(HTreeMap.java:300)
at com.graphhopper.reader.gtfs.GtfsReader.addTrip(GtfsReader.java:484)
at com.graphhopper.reader.gtfs.GtfsReader.addTrips(GtfsReader.java:431)
at com.graphhopper.reader.gtfs.GtfsReader.lambda$buildPtNetwork$3$GtfsReader(GtfsReader.java:201)
at com.graphhopper.reader.gtfs.GtfsReader$$Lambda$0.accept(Unknown Source:4)
at java.lang.Iterable.forEach(Iterable.java:75)
at com.graphhopper.reader.gtfs.GtfsReader.buildPtNetwork(GtfsReader.java:175)
at com.graphhopper.reader.gtfs.GtfsReader.readGraph(GtfsReader.java:143)
at com.graphhopper.reader.gtfs.GraphHopperGtfs.createOrLoad(GraphHopperGtfs.java:369)
at com.graphhopper.android.MainActivity$6.saveDoInBackground(MainActivity.java:401)
at com.graphhopper.android.MainActivity$6.saveDoInBackground(MainActivity.java:392)
at com.graphhopper.android.GHAsyncTask.doInBackground(GHAsyncTask.java:12)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
10-10 15:37:20.332 9345-9345/com.graphhopper.android W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.NoSuchMethodException: []
at java.lang.Class.getConstructor0(Class.java:2320)
at java.lang.Class.getConstructor(Class.java:1725)
at org.mapdb.SerializerPojo.createInstanceSkippinkConstructor(SerializerPojo.java:579)
at org.mapdb.SerializerPojo.deserializeUnknownHeader(SerializerPojo.java:467)
… 32 more