Dieser Bereich ist für die Entwickler gedacht
Erstelle ein Plugin für EgiGeoZone
Ab der Version 2.0.4 können Entwickler ein Plugin nach ihren Bedürfnissen für EgiGeoZone entwickeln.
Rezept um ein EgiGeoZone-Plugin zu entwickeln
- Zuerst ein neues Android Projekt erstelln und da mindestens eine
Activity für die Plugin-Konfiguration, wenn nötig, erstellen. Das
Plugin ist selbst für das Abspeichern der Konfiguration zuständig.
Man kann diese z.B. in den SharedPreferences oder in einer Datenbank
speichern.
- Das Projekt sollte auch einen BroadcastReceiver
oder besser einen WakefulBroadcastReceiver, welcher
die Intents empfangen wird, anlegen. Dieser BroadcastReceiver muss
auf die Aktion "de.egi.geofence.geozone.plugin.EVENT"
hören. Dieser BroadcastReceiver startet dann am besten einen Dienst
(Service), welcher dann die Plugin-Arbeit erledigt.
- Der von der EgiGeoZone-App gelieferte Intent stellt folgende
Parameter zur Verfügung:
- "transition" : "1" für Betreten und "0" für Verlassen der Zone
- "zone_name" : Name der Zone
- "latitude" : Breitengrad der Zone
- "longitude" : Längengrad der Zone
- "device_id" : Eine UUID, welche die ID des mobilen Gerätes darstellen soll
- "date_iso" : UTC-Datum und Zeit im Format "yyyy-MM-dd'T'HH:mm:ss'Z'"
- "date_device": Lokales Datum und Zeit im Format "yyyy-MM-dd'T'HH:mm:ss"
Neue Parameter können gerne angefordert werden. Sofern diese von
der Haupt-App geliefert werden können, werde ich diese in einer
neuen Version bereitstellen.
- Sobald eine Zone Betreten oder Verlassen wird, werden alle Plugins
mit der Intent-Filter-Aktion "de.egi.geofence.geozone.GETPLUGINS"
gesucht und nur an diese wird die Übermittlung gestartet.
Beispiel für diesen Teil in der Manifest-Datei:
<activity android:name=".ExamplePluginMain" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="de.egi.geofence.geozone.GETPLUGINS" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
- Für einen WakefulBroadcastReceiver ist noch folgende Erlaubnis
(permission) erforderlich:
<uses-permission android:name="android.permission.WAKE_LOCK"
/>
- Die EgiGeoZone-App führt die auf dem Gerät gefundenen Plugins
unter dem Menüpunkt Verwaltung auf. Mit einem Klick auf einem der
Plugins, kann die Haupt-Activity des Plugins aufgerufen werden.
Deshalb ist es eine gute Idee den "application label" und
"application icon" zu referenzieren.
Diese werden für die Auflistung und dem Aufruf benötigt:
<application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" ...
- Zur Erinnerung: der deifinierte Receiver im Plugin muss auf die "de.egi.geofence.geozone.plugin.EVENT" Aktion hören, sonst kann dieser nicht die Parameter empfangen:
<receiver android:name=".ExampleBroadcastReceiverPlugin"> <intent-filter> <action android:name="de.egi.geofence.geozone.plugin.EVENT" /> </intent-filter> </receiver>
- (10.03.2017) Man kann nun aus den Plugins die
Namen der definierten Zonen aus der Haupt-App abrufen. Dazu habe ich
in den Apps einen ContentProvider eingebunden.
Da es aber zwei Apps gibt eine EgiGeoZone und eine EgiGeoZoneBT,
sollten auch beide Variante im Plugin zur Auswahl stehen. Der
Unterschied ist ein zusätzliches ".bt" im Package
Namen.
Plugin für EgiGeoZone:
private static final Uri CONTENT_URI = Uri.parse("content://de.egi.geofence.geozone.zonesContentProvider/zoneNames");
Aufrufbeispiel:
private static final Uri CONTENT_URI = Uri.parse("content://de.egi.geofence.geozone.zonesContentProvider/zoneNames"); private static final String CN_NAME = "name"; .... // Returns the zone names. You may not select other fields or make changes on them ContentResolver cr = this.getContentResolver(); Cursor cursor = cr.query(CONTENT_URI, null, null, null, null); if (cursor.moveToFirst()) { do{ Toast.makeText(this, cursor.getString(cursor.getColumnIndex(CN_NAME)), Toast.LENGTH_SHORT).show(); } while (cursor.moveToNext()); }
Plugin für EgiGeoZoneBT:
private static final Uri CONTENT_URI = Uri.parse("content://de.egi.geofence.geozone.bt.zonesContentProvider/zoneNames");
Aufrufbeispiel:
private static final Uri CONTENT_URI = Uri.parse("content://de.egi.geofence.geozone.bt.zonesContentProvider/zoneNames"); private static final String CN_NAME = "name"; .... // Returns the zone names. You may not select other fields or make changes on them ContentResolver cr = this.getContentResolver(); Cursor cursor = cr.query(CONTENT_URI, null, null, null, null); if (cursor.moveToFirst()) { do{ Toast.makeText(this, cursor.getString(cursor.getColumnIndex(CN_NAME)), Toast.LENGTH_SHORT).show(); } while (cursor.moveToNext()); }
- Ein Beispiel-Plugin als Quellcode kann hier heruntergeladen
werden:
ExamplePluginSource.zip
Dieses Plugin zeigt eine Benachrichtigung, wenn in EgiGeoZone ein
Event eintritt.
- Das Beispiel-Plugin kann man aus dem Google Play Store
installieren:
Beispiel Plugin
Nicht vergessen, unter Verwaltung in
der Haupt-App die "Übermittlung an Plugins" zu erlauben.