GPS Daten vom System auslesen

  • Antworten:21
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 8

25.05.2017, 13:03:36 via Website

Hallo zusammen,

nachdem ich jetzt etliche Foren durchforstet, Beiträge dazu durchgelesen und Tutorials durchgegangen bin, verzweifel ich hier langsam.
Ich möchte so einfach wie möglich an die GPS Koordinaten (Long, Lat und Alt) kommen, um damit später weiterarbeiten zu können.

Erstmal möchte ich versuchshalber mir die GPS Koordinaten anzeigen lassen. Dazu habe ich eine MainActivity mit zwei TextViews für Longitude und Latitude erstellt, und diese mit dem LocationListener verknüpft. Dann starte ich den Emulator, drücke unter "Location" auf "SEND" und müsste nun die Location angezeigt bekommen. Es passiert aber gar nichts. Weder eine Fehlermeldung, noch angezeigte Koordinaten. Habe es auch schon auf meinem richtigen Gerät versucht. Ich vermute fast, dass es nur ein ganz kleiner, dummer Fehler ist, den ich aber nicht finde.

Vielleicht kann mir ja hier jemand helfen :)

Mein momentaner Code:

package com.example.findlocation_test2;

import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

TextView textLat;
TextView textLong;
TextView textAlt;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textLat = (TextView) findViewById(R.id.textLat);
    textLong = (TextView) findViewById(R.id.textLong);
    textAlt = (TextView) findViewById(R.id.textAlt);

    LocationManager lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    LocationListener ll = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

            if(location != null) {
                double dLat = location.getLatitude();
                double dLong = location.getLongitude();
                double dAlt = location.getAltitude();

                textLat.setText(Double.toString(dLat));
                textLong.setText(Double.toString(dLong));
                textAlt.setText(Double.toString(dAlt));
            }
            else {
                textLat.setText("Fehler");
                textLong.setText("Fehler");
                textAlt.setText("Fehler");
            }
        }

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

        }

        @Override
        public void onProviderEnabled(String provider) {

            Toast.makeText(getBaseContext(), "GPS wurde akiviert",
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onProviderDisabled(String provider) {

            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
            Toast.makeText(getBaseContext(), "GPS wurde deaktiviert",
                    Toast.LENGTH_SHORT).show();

        }
    };

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, ll);

}

}

Antworten
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.167

25.05.2017, 14:58:28 via Website

Hallo Steffen,

herzlich willkommen hier im Forum (*)
Ich habe deinen Thread in den richtigen Bereich verschoben.


Deine Permission Abfrage fehlt, also musst du diese händisch aktivieren, dann funktioniert das ganze auch.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Steffen W.

Antworten
  • Forum-Beiträge: 2.902

25.05.2017, 15:02:43 via Website

Hallo Steffen,

Willkommen im Forum ,

Deine angewandte Technik ist nur noch auf einigen Devices lauffähig und
eigentlich deprectated seit 4.x.

Google stellt mit dem GoogleApiClient die triangulare Positionsermittlung zur Verfügung
und der Basis LocationService wird von Version zu Version immer mehr komplett herausgenommen.

Es gibt auch dabei keine zwingende erforderliche GPS-Sensor Permission.

public class MyGPSClass implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
com.google.android.gms.location.LocationListener

@Ludy
Hat er die nicht ganz unten ?? Oder bin ich blind ? :-)

— geändert am 25.05.2017, 15:15:32

Liebe Grüße - Stefan
[ App - Entwicklung ]

Steffen W.Pascal P.

Antworten
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.167

25.05.2017, 15:17:52 via Website

@Stefan, nein das ist nur die Überprüfung ob eine Permission vorhanden ist, ist aber nicht der Abfragedialog, und als veraltet hab ich den LocationListener auch nicht gelesen, funktioniert auf allen getestetsten OS-Versionen.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Maximilian MöllerSteffen W.

Antworten
  • Forum-Beiträge: 8

25.05.2017, 15:18:33 via Website

Oje, ich habe gehofft, das vermeiden zu können.

Zieldevice ist eine AR-Brille die auf Android 4.0.4 läuft, mit integriertem GPS-Empfänger.

Wie funktioniert das mit dem GoogleApiClient? Ich möchte garnichts mit Google Maps oder dergleichen machen, sondern eine unabhängige Software haben, die auch ohne Internetverbindung etc. läuft.

Um das ganze nochmal in einen Zusammenhang zu stellen:

  • Es sollen zunächst Referenzkoordinaten eingegeben werden (oder durch Klicken auf einen Button gespeichert werden)
  • Anschließend soll durch Abgleich mit der aktuellen Position (also dem LocationListener und der onLocationChanged-Methode) der Abstand zwischen den Positionen ermittelt werden. Soweit ich weiß, gibt es eine Funktion, mit der der Abstand direkt bestimmt wird. Ansonsten lasse ich den einfach manuell berechnen. Die Genauigkeit ist erstmal nebensächlich.

Das ganze ist deutlich komplizierter als ich es mir vorgestellt habe. Weiß inzwischen garnicht mehr, wo ich anfangen soll...

Danke schonmal für die schnellen Rückmeldungen und das Verschieben in den korrekten Thread!

Beste Grüße

Antworten
  • Forum-Beiträge: 2.902

25.05.2017, 15:24:33 via Website

@Ludy
Mea Culpa, übersehen

in dem Falle stimme ich Dir zu , ich ging allerdings davon aus , dass er das Ding eh eingeschaltet hat.
Sein Code sieht ja eigentlich gut aus .

Zum APIClient ...

Ich hatte auch das obige drin, und dann bin ich über einen I/O Artikel gestolpert und habe
daraufhin umgestellt .
Ich fand das obige auch irgendwie besser - zumal du bei der API keine genaue Abweichung bekommst und
auch nicht Quelle erfährst

— geändert am 25.05.2017, 15:51:09

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 2.902

25.05.2017, 15:29:53 via Website

Hallo Steffen,

das hier ist aus meinem Snipet - habe ich also jetzt nicht mehr getestet
(Ist schon ein wenig her)
Dürfte dir aber helfen

public class GPS_INTERNAL_MainClass  implements  GoogleApiClient.ConnectionCallbacks,
                                             GoogleApiClient.OnConnectionFailedListener,
                                             com.google.android.gms.location.LocationListener
{
    private static final String TAG = "_TYC" + "INTERNAL_GPS";
    private static boolean currentlyProcessingLocation = false;
    private static LocationRequest locationRequest;
    private static GoogleApiClient googleApiClient;
    private CountDownTimer p_CountDownTimer;
    private static int       SAVE_LAST_VALUE = 0;
    private static SharedPreferences settings;
    private static AppGlobals G;
    private static Context context;
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void start(Context con)
    {

        context = con;
        if (!currentlyProcessingLocation)
        {
            currentlyProcessingLocation = true;
            this.startTracking();
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void stop()
    {
        if (googleApiClient != null && googleApiClient.isConnected())
        {
            googleApiClient.disconnect();
            currentlyProcessingLocation = false;
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    private void startTracking()
    {
        GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();
        int result = googleAPI.isGooglePlayServicesAvailable(context);
        if (result == ConnectionResult.SUCCESS)
        {
            googleApiClient = new GoogleApiClient.Builder(context)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
            if (!googleApiClient.isConnected() || !googleApiClient.isConnecting())
            {
                googleApiClient.connect();
            }
        } else
        {
            Log.d(TAG, "unable to connect to google play services.");
        }
    }
    @Override
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void onLocationChanged(Location location)
    {
        if (location != null)
        {
            if (location.getAccuracy() < 200.0f)
            {
                // umrechnung meter/per/sec  in km/h
                G.POSITION_SPEED  = (location.getSpeed() / 1000.0d) / (1.0 / 3600.0);
                G.POSITION_LAT    = location.getLatitude();
                G.POSITION_LON    = location.getLongitude();
                G.POSITION_COURSE = (double) location.getBearing();
            }
        }
    }
    @Override
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void onConnected(Bundle bundle)
    {
        locationRequest = LocationRequest.create();
        locationRequest.setInterval(5000); // milliseconds
        locationRequest.setFastestInterval(4000); // the fastest rate in milliseconds at which your app can handle location updates
        //locationRequest.setExpirationDuration(0);
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        try {
            LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
        } catch (SecurityException e) {

        }
    }
    @Override
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void onConnectionFailed(ConnectionResult connectionResult)
    {
        stop();
    }
    @Override
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void onConnectionSuspended(int i)
    {
        MyLog.d(TAG, "connection has been suspend");
    }
    ////////////////////////////////////////////////////////////////////////////////////////////
    private static float distFrom(float lat1, float lng1, float lat2, float lng2)
    {
        double earthRadius = 6371000; //meters
        double dLat = Math.toRadians(lat2-lat1);
        double dLng = Math.toRadians(lng2-lng1);
        double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *  Math.sin(dLng/2) * Math.sin(dLng/2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        float dist = (float) (earthRadius * c);

        return dist;
    }

}

compile 'com.google.android.gms:play-services-location:9.x'

— geändert am 25.05.2017, 15:52:53

Liebe Grüße - Stefan
[ App - Entwicklung ]

Steffen W.

Antworten
  • Forum-Beiträge: 8

25.05.2017, 17:47:32 via Website

Ehrlich gesagt konnte ich mit deinem Code nicht viel anfangen. Bin blutiger Anfänger mit dem Ganzen.

Ich habe mit meinem Code nochmal ein bisschen rumprobiert (also an unterschiedliche Stellen einfache Bildschirmausgaben eingebaut). Ich komme offenbar garnicht erst in diese "onLocationChanged"-Methode rein bzw. in den LocationListener. Alles, was innerhalb von "ll = new LocationListener(){...}" fällt, wird nicht wiedergegeben.

Ich habe auch versucht, den LocationListener direkt in die MainActivity zu implementieren, das hat aber auch nichts gebracht.

VG
Steffen

Antworten
  • Forum-Beiträge: 2.902

25.05.2017, 20:24:48 via Website

Hallo Steffen,

um die Funktionsweise zu verstehen, muss man ein wenig fundierte Praxis in der Programmierung von Android
mitbringen.

Listener sind Ereignisse, die von der jeweiligen Klasse aufgerufen werden, wenn etwas entsprechendes
vorliegt. Sie werden daher nicht vom Programmierer direkt aufgerufen.

Ich würde Dir empfehlen , grundsätzlich mit einfachen Aufgabengebieten zu beginnen
und dann sich heranzutasten.

Copy & Paste führt zu gar nix. Man muss das was man tut, auch zu 100 % verstehen.

— geändert am 25.05.2017, 20:30:58

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 8

26.05.2017, 10:48:53 via Website

Hallo Stefan,

ja, ich gebe dir absolut Recht, dass ich von Copy&Paste nicht viel habe. Deshalb versuche ich mir ja hier den nötigen Denkanstoß zu holen, und kopiere nicht einfach irgendeinen Code aus dem Internet.

Mit "einfachen" Aufgabengebieten habe ich schon begonnen, mit sowas wie onClickListenern z.B. kann ich ja umgehen. Aber da soll es ja nicht aufhören, und meine Zielsetzung ist jetzt dieses Abrufen der GPS-Koordinaten. Und sich 50 YouTube Tutorials anzugucken oder Bücher dazu zu lesen (was ich allerdings auch gemacht habe) bringt meiner Meinung nach weniger, als einfach mal anzufangen und zu probieren. Ich dachte, zu meinem Problem gibt es eine "einfache" Lösung (bzw. Ideen, wo das Problem liegen könnte), die ein erfahrener Androidkenner (der ich nunmal noch nicht bin, deshalb habe ich mich hier angemeldet) erkennt und mir so helfen kann.

Danke trotzdem für die Antwort, für jeden weiteren Tipp bin ich natürlich dankbar!
VG
Steffen

Antworten
  • Forum-Beiträge: 4

26.05.2017, 11:33:54 via Website

Hast du auch die Permissions im Android Manifest File gesetzt?

AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

— geändert am 26.05.2017, 11:35:22

Antworten
  • Forum-Beiträge: 2.902

29.05.2017, 15:50:54 via Website

Maximilian , bitte schau dir seinen Code genauer an ,

Jetzt hast du zwei Fragen gestellt , die er oben schon mit seinem Code beantwortet hat

LocationListener ll = new LocationListener() {
@Override
public void onLocationChanged(Location location) {

Liebe Grüße - Stefan
[ App - Entwicklung ]

Maximilian Möller

Antworten
  • Forum-Beiträge: 2.902

29.05.2017, 17:22:13 via Website

@Ludy

Hut ab !!!

Liebe Grüße - Stefan
[ App - Entwicklung ]

Ludy

Antworten
  • Forum-Beiträge: 8

29.05.2017, 18:03:45 via Website

@Ludy

Super, vielen Dank. Jetzt versuche ich mal herauszufinden, wo der Knackpunkt liegt. Vermute, es hat was mit den Permissions zu tun.

Antworten
  • Forum-Beiträge: 8

02.06.2017, 10:57:22 via Website

Genau, und daran hat es auch gelegen. Ich dachte, dass es genügt, die Permission im manifest abzulegen, aber eine Abfrage hat eben noch gefehlt. So wie Ludy es ja auch direkt geschrieben hat :/ Aber jetzt funktioniert alles. Danke nochmal für die Mühe!

Wozu hast du den CustomLocationListener und das Interface implementiert? Es scheint auch erstmal soweit ohne dem Ganzen zu laufen, lediglich mit einer activity.

lg

— geändert am 02.06.2017, 11:00:30

Antworten

Empfohlene Artikel