EN

EgiGeoZone

EgiGeoZone Forum

Download

 

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.