Berechtigung auf GPS Empfänger funktioniert nicht.

  • Antworten:10
Holger Rodewald
  • Forum-Beiträge: 6

13.10.2016, 09:55:23 via Website

Berechtigung auf GPS Empfänger funktioniert nicht.

Guten Morgen,

ich versuche mich gerade mit der Android Programmierung und möchte mir eine App erstellen, die auf GPS Daten des Handys zugreift.
Ich habe einiges aus Tutorials übernommen, aber anscheinend bekommt mein Programm keinen Zugriff auf den GPS Empfänger.
Wenn ich vorher eine andere App starte, die den GPS Empfänger auswertet, und diese dann beende und meine App starte, sehe ich die letzte Position die mir das andere Programm angezeigt hat. Sie wird aber nicht aktualisiert.
Im Android Studio werden auch alle Zeilen, die mit dem LocationManager zu tun haben rot unterstrichen und mir beim draufzeigen mit der Maus „Missing permission required …“ angezeigt.
Ich habe schon die Zeile: „
In der AndroidManifest.xml eingetragen.

Hat noch jemand einen Tip?

Vielen Dank

Holger

Antworten
swa00
  • Forum-Beiträge: 3.704

13.10.2016, 10:38:22 via Website

Hallo Holger,

willkommen in unserem Forum.

Ohne Code können wir natürlich recht wenig helfen.

.
Zu den einfachen Sachen :

1) Neben dem Eintrag in der Manifest : Hast du zufällig Marshmallow im einsatz ? wenn ja , hast du deiner App auch die Berechtigungen manuell gegeben ??
2) Die GPS Funktion kann man nicht seitens einer App ein und ausschalten (ausser root) Die muss nachwievor manuell durch den User erfolgen - hierzu kannst du das ja vorher in deiner App abfangen.

— geändert am 13.10.2016, 10:51:52

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

Antworten
Holger Rodewald
  • Forum-Beiträge: 6

13.10.2016, 11:58:54 via Website

Hallo Stefan,

vielen Dank für die Antwort.
Das Handy ist ein altes Samsung Galaxy Ace.
GPS habe ich auf dem Handy manuell aktiviert.
Ich habe auch gewartet, bis das Symbol aufhört zu blinken.
(Der Bikecomputer hat auch funktioniert)

Nun zu einigen Code Zeilen.
AndroidManifest.xml:




GPSAbstand.java:
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
...
public void setPosition() {

    locationManager = (LocationManager) c.getSystemService(c.LOCATION_SERVICE);
    //ließt den GPS Status aus (Aktiv = Ja/Nein)
    GPSaktiv = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (GPSaktiv) {
        if (position == null) {
            //Bestimmung der GPS Position, sofern GPS eingeschaltet ist. Die Daten werden später in der Variable "position" gespeichert.
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 10, this);
            if (locationManager != null) {
                position = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            }
        }
    }

}

Gruß
Holger

Antworten
swa00
  • Forum-Beiträge: 3.704

13.10.2016, 12:12:08 via Website

Hallo Holger,

sehe ich die letzte Position die mir das andere Programm angezeigt hat. Sie wird aber nicht aktualisiert.

An welcher Stelle GENAU hast du schon ein Permission - nach dieser Aussage hast du doch zugriff ??

Abgesehen davon , dass dein Manifest-Eintrag hier nicht zu sehen ist ( ich gehe mal davon aus, dass es ACCESS_FINE_LOCATION" ist) müsste es von der Initalisierung her auf den ersten Blick eigentlich gehen
AUSSER, dass du alles in einer Funktion drin hast - das geht wiederum NICHT.

Was ist mit den Callbacks ?? (LocationListener)

Dann gibst du an , dass das Ding dir erst alle 60000 ms UpdateTime bei einer Tolleranz von 10 Metern was ausgeben soll.
Dann verwendest du getLastKnownLocation, also die letzte bekannte Position - du solltest auch getLatitude() und getLongitude() verwenden.

Was mir allerdings auffällt , du machst nur einen reinen ACCESS auf GPS und nicht auf "NETWORK_PROVIDER".

P.S Die Technik , die du verwendest ist schon veraltet , du solltest lieber diese hier nehmen
https://developers.google.com/android/guides/api-client
.

— geändert am 13.10.2016, 12:39:57

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

Antworten
Holger Rodewald
  • Forum-Beiträge: 6

13.10.2016, 12:37:27 via Website

Hallo Stefan,

Die Mitteilung "Call requires permission which maxy be rejected by user:....." sehe zu allen Zeilen, die den LocationManager ansprechen. Evtl. hat das auch nichts zu sagen und ich interpretiere das Verhalten des Telefons falsch.
Der oben aufgeführte Code ist die gesamte Funktion. Es gibt aber noch ein paar in der Klasse.
ich befürchte, dass der Fehler doch woanders ist.
Deshalb Kopiere ich mal die ganze Klasse in den Post.
Ich nehme keine Provider Daten, da das Telefon ein Ausrangiertes meiner Kinder ist und ich dieses ohne SIM-Karte benutze. Halt nur für solche Spielerein/Zum Programmieren lernen.
Ich habe mal in den Link geschaut. Aber ich befürchte, ich brauche Wochen um das zu verstehen.

Vielen Dank für Deine Hinweise.

Holger

public class GPSAbstand implements LocationListener {

private final Context c;

//Variable, zum speichern, ob GPS aktiv ist
private boolean GPSaktiv = false;

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

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

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

public void setPosition() {

    locationManager = (LocationManager) c.getSystemService(c.LOCATION_SERVICE);
    //ließt den GPS Status aus (Aktiv = Ja/Nein)
    GPSaktiv = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (GPSaktiv) {
        if (position == null) {
            //Bestimmung der GPS Position, sofern GPS eingeschaltet ist. Die Daten werden später in der Variable "position" gespeichert.
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 60000, 10, this);
            if (locationManager != null) {
                position = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            }
        }
    }

}

//Beendet GPS Bestimmung
public void stopGPSposition(){
    if(locationManager != null){
        locationManager.removeUpdates(GPSAbstand.this);
    }
}

//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 GPS eingeschaltet ist (true oder false)
public boolean istGPSaktiv() {
    return this.GPSaktiv;
}

public void onResume(){
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10, this);
}

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

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onProviderEnabled(String provider) {
}

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

//Gibt den Abstand zwischen dem Ziel und der Position als double zurück
public static double calcAbstand(double laengengrad, double breitengrad, double ziellaengengrad, double zielbreitengrad){
    double lat;
    double dx;
    double dy;
    double distance;

    lat = (breitengrad + ziellaengengrad) / 2 * 0.01745;
    dx = 111.3 * Math.cos(lat) * (laengengrad - zielbreitengrad);
    dy = 111.3 * (breitengrad - ziellaengengrad);
    distance = Math.sqrt(dx * dx + dy * dy);
    return distance;

}

//Gibt den Abstand zwischen dem Ziel und der Position als double zurück mit Android tools
public static double calcAbstand2(double laengengrad, double breitengrad, double ziellaengengrad, double zielbreitengrad) {
    Location a = new Location("Standort");
    a.setLatitude(laengengrad);
    a.setLongitude(breitengrad);

    Location b = new Location("Ziel");
    b.setLatitude(laengengrad);
    b.setLongitude(breitengrad);

    return a.distanceTo(b);
}

}

Antworten
swa00
  • Forum-Beiträge: 3.704

13.10.2016, 12:45:36 via Website

Hallo Holger, wir kommen schon der Sache näher :-)

  • nimm mal bitte android:name="android.permission.ACCESS_COARSE_LOCATION rein
  • setzte deine Init-Zeit mal runter (60000) und
  • ermittel deine Postion innerhalb @onLocationChanged mit getLatitude() , mach mal nix anderes und gebe nur ein Log aus

— geändert am 13.10.2016, 12:55:06

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

Holger Rodewald

Antworten
swa00
  • Forum-Beiträge: 3.704

13.10.2016, 13:03:55 via Website

Hier mal ein Teil aus meinem Geraffel

in Gradle kommt das hier rein

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

public class GPS_Class  implements  GoogleApiClient.ConnectionCallbacks,
                                             GoogleApiClient.OnConnectionFailedListener,
                                             com.google.android.gms.location.LocationListener
{
    private static final String TAG = "INTERNAL_GPS";
    private boolean currentlyProcessingLocation = false;
    private LocationRequest locationRequest;
    private GoogleApiClient googleApiClient;

    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void start(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() < 10.0f)
            {
                double lat  = (double)location.getLatitude();
                double lon    = (double) location.getLongitude();
                double course = (double) location.getBearing();
            }
        }
    }

    @Override
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void onConnected(Bundle bundle)
    {
        locationRequest = LocationRequest.create();
        locationRequest.setInterval(5000); // milliseconds
        locationRequest.setFastestInterval(4000); //updates
        //locationRequest.setExpirationDuration(20000); // Abbruch  nach 20  sekunden
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        try {
            LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
        } catch (SecurityException e) {

        }
    }

    @Override
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void onConnectionFailed(ConnectionResult connectionResult)
    {
    }

    @Override
    ////////////////////////////////////////////////////////////////////////////////////////////////
    public void onConnectionSuspended(int i)
    {
    }

}

— geändert am 13.10.2016, 15:48:56

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

Holger Rodewald

Antworten
Holger Rodewald
  • Forum-Beiträge: 6

13.10.2016, 13:16:55 via Website

Hallo Stefan,

ich befürchte, ich bin zu alt für objektorientiertes Programmieren.
Die Permission hatte ich bereits gesetzt. und 60000 war auch schon da.
Deinen dritten Hinweis verstehe ich nicht.
Die Funktion getLatitude() gibt nur einen der Werte zurück und muss dann doch einer Variablen zugewiesen werden.
Oder gibt es da noch eine, die mir nicht bekannt ist.

Vielen Dank und Gruß
Holger

Antworten
Holger Rodewald
  • Forum-Beiträge: 6

13.10.2016, 13:22:59 via Website

Nochmal Hallo,

Da kam ja noch eine Info während ich die Erste noch gelesen habe.
Die werde ich mit nachher mal in Ruhe ansehen.

Vielen vielen Dank
Holger

Antworten
swa00
  • Forum-Beiträge: 3.704

13.10.2016, 13:25:14 via Website

Hallo Holger,

grundsätzlich bist du auf dem richtigen weg - das mal vorweg.
Allerdings machst du ( um einen Fehler zu lokalisien) zuviel auf einmal.

Deshalb habe ich dich gebeten , erst mal die 60000 runter zu setzen - vorher wirst du keine Änderung in
onLocationChanged bekommen , es sei denn du wartest.

und in onLocationChanged gibst nur mal

Log.d("HOLGER",String.format ("%f",location.getLatitude()));
Log.d("HOLGER",String.format ("%f",location.getLongitude()));

aus - MEHR Nicht ..

Alles andere, was du dann noch gebaut hast , lass erst mal bleiben und damit meine ich auch ALLES
(Auch onResume - da vermute ich auch was - das gehört nämlich gar nicht hierher - macht keinen Sinn! )

also brav nur setposition() und warten & ggf rumlaufen -
Du bekommst nur dann eine Änderung wenn deine Zeit rum ist und du dich auch ein paar meter bewegt hast

— geändert am 13.10.2016, 14:27:51

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

Holger Rodewald

Antworten
Holger Rodewald
  • Forum-Beiträge: 6

14.10.2016, 20:35:34 via Website

Hallo mal wieder,
ich habe das mit dem Log probiert.
Irgendwie bekomme ich das nicht hin.
Was mir aber bei weiteren Versuchen aufgefallen ist:
Wenn ich das Telefon während der Fahrt drehe, bekomme ich eine neue Position angezeigt.
Vielleicht weiß ja jetzt jemand, wo mein Fehler ist.

Vielen Dank und eine fröhliche Nacht
Holger

Antworten