Apps für Android programmieren leicht gemacht!
Netzwerk Position

Netzwerk Position

Viele Apps nutzen die Längen- Breitengrade, um die genaue Position des Smartphones zu bestimmen. Wir möchten uns in diesem Artikel der Bestimmung der Netzwerk Position widmen.
Dabei nutzen wir entgegen der GPS Ortung keine Satelliten, sondern lediglich die umgebenen Netzwerke.

Mit Hilfe mindestens dreier Mobilfunkmasten kann die genaue Position (bis auf ein paar Meter genau) bestimmt werden. Zusätzlich können W-Lan Netze in der Nähe zu Bestimmung dienen. Somit können Längen- und Breitengrade des Aufenthaltsortes bestimmt werden. Mit Hilfe eines kleinen Java Codes können wir eben diese Längen- und Breitengrade in Android auslesen und verwerten. Diese Methode ist allerdings nicht so genau, wie die GPS Methode.
Aber Achtung: Eine Bestimmung der Netzwerk Position ist nur möglich, wenn der Anwender den Flugmodus in seinem Smartphone nicht aktiviert hat!

 

Netzwerk Position bestimmen:

Fangen wir nun an zu programmieren.
Wir benötigen als aller erstes einmal die Berechtigung in unserer App die Netzwerk Funktion nutzen zu dürfen.
Diese holen wir uns über folgende Tags innerhalb der Datei „AndroidManifest.xml“ ein:

<!--Bestimmung der genauen Position-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Über die Berechtigung der genaue Position werden ebenfalls Daten wie die Namen der W-Lan Netzwerke, in der Nähe, und das Telefonnetz einbezogen. Durch diese zusätzlichen Daten ist eine genauere Bestimmt der Position möglich.

Nachdem wir nun unsere Berechtigungen von Android bekommen haben benötigen wir eine Klasse, die die Netzwerk Position bestimmen und zurückgeben kann.
Dazu erstellen wir eine neue Klasse Namens „NetzwerkBestimmung“ und schreiben folgendes hinein:

public class NetzwerkBestimmung extends Service implements LocationListener {

    private final Context c;

    public NetzwerkBestimmung(Context context) {
        this.c = context;
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}

Damit haben wir unser Grundgerüst. Alle zu überschreibenden Funktionen sind überschrieben. Alle folgenden Funktionen sind für uns erst wirklich von Belang.

Da wir gerne möchten, dass uns die Klasse „NetzwerkBestimmung“ etwas ausgibt, benötigen wir Variablen. Wir können Längengrade und Breitengrade ausgeben und zurückgeben, ob die Positionsbestimmung möglich ist.
Diese Variablen mit in die Klasse „NetzwerkBestimmung“ schreiben:

//Variable, zum speichern, ob die Bestimmung per Netzwerk aktiv ist
private boolean Netzwerkaktiv = false;

//Die Variable Location wird später benötigt und beinhaltet den Längen- und Breitengrad
Location position;

//Die Variable LocationManager wird später benötigt und ermöglicht die Positionsbestimmung
protected LocationManager locationManager;

 

Anschließend benötigen wir Funktionen, die uns diese Daten ausgeben können:

//Gibt den Breitengrad als Double zurück
public double getBreitengrad(){
    if (position != null){
        return position.getLatitude();
    }else{
        return 0;
    }
}

//Gibt den Längengrad als double zurück
public double getLaengengrad(){
    if(position != null){
        return position.getLongitude();
    }else{
        return 0;
    }
}

//Gibt zurück, ob die Bestimmung per Netzwerk möglich ist (true oder false)
public boolean istNetzwerkaktiv() {
    return this.Netzwerkaktiv;
}

 

Um die Variable „Position“ zu beschreiben benötigen wir folgende Funktion:

public void setPosition() {
    try {
        locationManager = (LocationManager) c.getSystemService(LOCATION_SERVICE);

        //ließt den Netzwerk Status aus (Aktiv = Ja/Nein)
        Netzwerkaktiv = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (Netzwerkaktiv) {
            //Bestimmung der Netzwerk Position, sofern dies verfügbar ist. Die daten werden in der Variable "position" gespeichert.
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 10, this);
            if (locationManager != null) {
                position = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 

Zu guter letzt können wir noch ein kleinen wenig Schnickschnack einfügen. (Erklärung folgt gleich)

@Override
public void onLocationChanged(Location location) {
    position = location;
}

//Beendet die Netzwerk Bestimmung
public void stopNetzwerkposition(){
    if(locationManager != null){
        locationManager.removeUpdates(NetzwerkBestimmung.this);
    }
}

 

Erklärung:

Die Funktionsweise unserer Klasse „NetzwerkBestimmung“ ist folgendermaßen geregelt.
Beim Aufruf der Klasse wird diese mit samt ihren Variablen initialisiert.
Anschließend kann man die Funktion „setPosition“ aufrufen. Diese Funktion bestimmt die momentane Position, sofern dies möglich ist, und schreibt alles in unsere Variablen nieder.
Gleichwohl wird in der Funktion „setPosition“ auch ein Updateintervall festgelegt. Dieser Updateintervall liegt bei 10 Metern oder 60 Sekunden (in Millisekunden angegeben).
Wird dieser Intervall erreicht wird die Funktion „onLocationChanged“ angesprochen. Die Funktion „onLocationChanged“ beschreibt dann die neue Position in der Variable „position“ nieder und  somit können wir alle 10 Meter oder alle 60 Sekunden die aktuelle Position zurückgegeben bekommen.
Mit der Funktion „stopNetzwerkposition“ können wir diesen Updateintervall abschalten und somit Akku sparen.
Auslesen können wir, ab dem Aufruf der Funktion „setPosition“ die Längen- und Breitengrade mit den Funktionen „getLaengengrad“ und „getBreitengrad“.

 

Nutzung:

Möchten wir die Klasse „NetzwerkBestimmung“ nun in Aktion erleben können wir dies über folgenden Code:

package de.droid_lernen.netzwerkposition;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class MainActivity extends Activity {

    NetzwerkBestimmung NW;
    TextView l;
    TextView b;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NW = new NetzwerkBestimmung(this);
        NW.setPosition();

        l = (TextView) findViewById(R.id.textLaengenGrad);
        b = (TextView) findViewById(R.id.textBreitenGrad);

        if(NW.istNetzwerkaktiv() == true){
            //Ortung ist möglich, Grade ausgeben
            l.setText("Längengrad: " + NW.getLaengengrad());
            b.setText("Breitengrad: " + NW.getBreitengrad());
        }
    }

}

Wenn unsere Datei activity_main.xml folgendermaßen aussieht:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Längengrad: 0"
        android:id="@+id/textLaengenGrad"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Breitengrad: 0"
        android:id="@+id/textBreitenGrad"
        android:layout_below="@+id/textLaengenGrad"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />


</RelativeLayout>

NetzwerkPosition


Lade dir den kompletten Source Code zu diesem Artikel herunter. Bestimme ganz einfach die Netzwerk Position deines Android Smartphones.

DownloadLizenzbedingungen

Marvin

Ich bin 23 Jahre jung und studiere zurzeit Wirtschaftsinformatik an der Georg-August-Universität in Göttingen. Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld