2017-05-26 4 views
0

Ich versuche, den Standort des Benutzers mit Netzwerk sowie GPS zu erhalten. Dies ist, wie mein Flow geht -Force schließen auf Android-Standort Berechtigungen

  1. Get Location
  2. Überprüfen Sie, ob Network_Provider
  3. Wenn diese Option aktiviert aktiviert ist, für Berechtigungen überprüfen, Berechtigungen erwerben und den Standort mit Netzwerk.
  4. Wenn nicht, suchen Sie nach GPS_Provider, wenn nicht aktiviert, aktivieren GPS aus Einstellungen Aktivität sonst erwerben Berechtigungen und erhalten Sie den Standort mit GPS.

Das Problem - Wenn ich versuche, die Berechtigungen zu beantragen, geht die App in Kraft schließen Modus. Vielleicht frage ich Berechtigungen an der falschen Stelle? Bitte werfen Sie etwas Licht.

Hier ist der Code für die gleiche -

private void getLocationMgr() { 
       LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
       boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
       Log.v(TAG, "Network enabled? " + isNetworkEnabled); 
       if (isNetworkEnabled) { 
        getLocation(locationManager, LocationManager.NETWORK_PROVIDER); 
       } else { 
        boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
        if (isGPSEnabled == false){ // go to GPS settings} 
        else { 
        getLocation(locationManager, LocationManager.GPS_PROVIDER); 
        } 
       } 
     } 

private void getLocation(final LocationManager locationManager, final String provider) { 
     // Getting permissions from user for location access 
     if (ContextCompat.checkSelfPermission(MainActivity.this, 
       android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERM_FINE_LOCATION); 
     } 

     locationManager.requestSingleUpdate(provider, new LocationListener() { 

      @Override 
      public void onLocationChanged(Location location) { 
       Log.v(TAG, "Provider: " + provider); 
       Log.v(TAG, "Location: " + location.getLatitude() + " " + location.getLongitude()); 
       Geocoder geocoder = new Geocoder(MainActivity.this, Locale.getDefault()); 
       try { 
        List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), 
          location.getLongitude(), 1); 
        if (addresses.size() > 0) { 
         Log.v(TAG, "City : " + addresses.get(0).getLocality()); 
         Log.v(TAG, "Country: " + addresses.get(0).getCountryCode()); 
         setCityExecute(addresses.get(0).getLocality(), addresses.get(0).getCountryCode()); 
        } else { 
         Log.v(TAG, "Unable to get city"); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onStatusChanged(String s, int i, Bundle bundle) { 
      } 

      @Override 
      public void onProviderEnabled(String s) { 

      } 

      @Override 
      public void onProviderDisabled(String s) { 
      } 
     }, null); 
    } 

Verursacht durch: java.lang.SecurityException: "Netzwerk" Standortanbieter erfordert ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION Erlaubnis. bei android.os.Parcel.readException (Parcel.java:1684) bei android.os.Parcel.readException (Parcel.java:1637) bei android.location.ILocationManager $ Stub $ Proxy.requestLocationUpdates (ILocationManager.java : 614) bei android.location.LocationManager.requestLocationUpdates (LocationManager.java:887) bei android.location.LocationManager.requestSingleUpdate (LocationManager.java:695) bei com.pavanbawdane.weatherinformation.MainActivity.getLocation (MainActivity.java:140) um c om.pavanbawdane.weatherinformation.MainActivity.getLocationMgr (MainActivity.java:99) bei com.pavanbawdane.weatherinformation.MainActivity.onCreate (MainActivity.java:81)

+0

"Wenn ich versuche, die Berechtigungen anzufordern, tritt die App in Kraft Close-Modus" - Verwenden Sie LogCat, um die Java-Stack-Ablaufverfolgung für Ihren Absturz zu untersuchen: https://Stackoverflow.com/questions/23353173/happy -myapp-has-stopped-wie-kann-ich-lösen-das – CommonsWare

+0

Der Absturz ist mit dem Dialogfeld Berechtigungen verknüpft. – Pavan

+0

Das hilft uns nicht viel, da wir Ihre Stapelverfolgung von hier aus nicht sehen können. Dein Monitor ist falsch herum ausgerichtet, und da ist die Krümmung der Erde zu beachten ... :-) Bitte bearbeite die Frage und poste den kompletten Java-Stack-Trace, der mit dem Absturz verbunden ist. – CommonsWare

Antwort

0

requestPermissions() asynchron ist. Zu der Zeit, die diese Methode zurückgibt, haben Sie nicht Erlaubnis noch. Der Benutzer wurde nicht einmal gefragt, um Ihnen die Erlaubnis zu dieser Zeit zu gewähren.

Wenn Sie feststellen, dass Sie nicht die Erlaubnis haben, und Sie müssen requestPermissions() anrufen, können Sie nicht versuchen, den Standort noch zu bekommen. Sie müssen dies frühestens in onRequestPermissionsResult() tun, wenn Sie darüber informiert werden, ob der Benutzer Ihnen die Erlaubnis erteilt hat.

Weitere Informationen zum Anfordern von Berechtigungen und zum Anfordern eines Standorts finden Sie unter this sample app.

+0

Danke @CommonsWare. Ich habe den onRequestPermissionResult() -Teil vermisst und wusste nicht, dass requestPermissions async ist. – Pavan

0

Rufen Sie nicht locationManager.requestSingleupdate() in getLocation() Methode.

Nachdem Sie die Berechtigung angefordert haben, überschreiben Sie die onRequestPermissionResult() - Methode. Innerhalb dieser Methode müssen Sie prüfen, ob die Berechtigung erteilt wurde oder nicht.

Wenn die Berechtigung erteilt wurde, rufen Sie locationManager.requestSingleupdate().

+0

Ja, Sie haben Recht. Vielen Dank. – Pavan

-1

Sie müssen diese wunderbare Bibliothek namens Dexter verwenden, die Ihnen leicht helfen, mit der Bitte um Erlaubnis und Maßnahmen zu handeln, wenn die Genehmigung bestätigt oder abgelehnt wurde.

+0

Es scheint wie eine wirklich gute Bibliothek. Ich werde es mir ansehen. Vielen Dank. :) – Pavan

Verwandte Themen