2016-02-03 7 views
5

Obecnie próbuję uzyskać szerokość i długość geograficzną bieżącej lokalizacji użytkownika. W manifeście włączono następujące uprawnienia. TargetSDK i min SDK są 23ACCESS_FINE_LOCATION przyznano w manifeście, ale zawsze odmawia się przyznawania uprawnień?

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.name.app"> 


<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <supports-screens 
     android:anyDensity="true" 
     android:largeScreens="true" 
     android:normalScreens="true" 
     android:smallScreens="false" /> 


    <activity 
     android:name=".SplashScreen" 
     android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".MainMenu" /> 
    <activity 
     android:name=".NeedToKnow" /> 
    <activity 
     android:name=".SelectTopic" /> 
    <activity 
     android:name=".DisplayTopicInformation"/> 
    <activity 
     android:name=".SelectCheckList" /> 
    <activity 
     android:name=".ViewCheckList"/> 
    <activity 
     android:name=".FindLocation"></activity> 
</application> 

<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" /> 


</manifest> 

W tym celu należy więc rozumiem, że muszę przeprowadzić kontrolę wykonania dla uprawnień. Jednak gdy wykonuję następujące czynności, zawsze otrzymuję -1 w zamian. (PERMISSION_DENIED)

int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), 
      Manifest.permission.ACCESS_FINE_LOCATION); 

Czy brakuje mi kroku podczas próby uzyskania dostępu do bieżących lokalizacji?

Pełny kod jest tutaj:

private String getZipcodeFromCurrentLocation() { 

    int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(), 
      Manifest.permission.ACCESS_FINE_LOCATION); 

    String zip = null; 
    Location location = null; 
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      latitude = location.getLatitude(); 
      longitude = location.getLongitude(); 

      Log.i("updated lat", String.valueOf(latitude)); 
      Log.i("updated lng", String.valueOf(longitude)); 
     } 


    }; 

    try { 
     if (PackageManager.PERMISSION_GRANTED == permissionCheck) { 
      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
     } 

    } catch (SecurityException e){ 
     e.printStackTrace(); 
    } 
    return zip; 

} 
+0

Proszę zaksięgować cały swój manifest. Jaka jest twoja "targetSdkVersion" i na jakiej wersji Androida testujesz? – CommonsWare

+0

Powodem sprawdzania w czasie wykonywania jest to, że użytkownik może całkowicie wyłączyć lokalizacje lub odmówić pozwolenia na aplikację, która ich potrzebuje. Czy to jedna z tych rzeczy? –

+0

@CommonsWare Dodałem Manifest – Airagale

Odpowiedz

8

Jeśli użytkownik wyłączył pozwolenie lokalizacji dla swojej aplikacji w ustawieniach telefonu, to trzeba wnioskować o pozwolenie. Poniżej znajdziesz przykładowy fragment kodu, jak to zrobić.

import android.Manifest; 
import android.app.Activity; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 

public class MyActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     boolean permissionGranted = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; 

     if(permissionGranted) { 
      // {Some Code} 
     } else { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 200); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case 200: { 
       if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // {Some Code} 
       } 
      } 
     } 
    } 
} 

Mam również zbudować klasę, która obsługuje wszystkie powyższe, a także zwraca lokalizację użytkownika. Oto link: https://www.dropbox.com/s/2mkyjok6mpna2yw/GPS.java?dl=0.

+1

Witaj w SO i dziękuję za odpowiedź na pytanie. Dodaj kontekst do swojej odpowiedzi oprócz kodu. –

+0

Będę musiał spróbować tego rozwiązania, gdy wrócę, ponieważ muszę już wkrótce wyjść. Moje pytanie do Arnolda polega na sprawdzeniu, czy użytkownik nie wyłączył swoich usług lokalizacyjnych? Nie oznacza to, że manifest zawiera pozwolenia na użytkowanie? – Airagale

+0

Twój plik manifestu jest w porządku, nie musisz niczego dodawać ani usuwać (może po prostu umieść znaczniki uprawnień przed tagami aplikacji, ale nie jestem pewien, czy to jest problem). Najpierw musisz sprawdzić, czy uprawnienia zostały przyznane przez użytkownika (Nie, że użytkownik ma włączone usługi lokalizacyjne), a następnie, jeśli zezwolił ci na korzystanie z jego sprawdzania lokalizacji, jeśli ma włączone usługi lokalizacyjne. Po prostu sprawdź plik, który umieściłem powyżej, a zobaczysz, że masz wszystko. –

Powiązane problemy