2016-02-03 23 views
5

Attualmente sto cercando di ottenere la latitudine e la longitudine della posizione corrente dell'utente. Ho abilitato le seguenti autorizzazioni nel manifest. TargetSDK e sdk min sono 23ACCESS_FINE_LOCATION essere concesso in manifest, ottenendo sempre il permesso negato?

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

Per fare così ho capito che ho bisogno di effettuare un controllo runtime per le autorizzazioni. Tuttavia, quando eseguo il seguente, ottengo sempre -1 in cambio. (PERMISSION_DENIED)

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

C'è un passaggio che mi manca quando tento di accedere alle posizioni correnti?

codice completo è qui:

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

Si prega di inviare l'intero manifest. Inoltre, qual è il tuo 'targetSdkVersion', e su quale versione di Android stai testando? – CommonsWare

+0

Il motivo per i controlli di runtime è che l'utente può disattivare completamente le posizioni o negare l'autorizzazione a un'app che le desidera. Uno di questi è il caso? –

+0

@CommonsWare Ho aggiunto il Manifest – Airagale

risposta

8

Se l'utente ha disabilitato posizione il permesso per la vostra applicazione nelle impostazioni del telefono, poi si deve chiedere che l'autorizzazione. Sotto troverai un esempio di codice su come farlo.

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} 
       } 
      } 
     } 
    } 
} 

Inoltre ho creato una classe che gestisce tutto quanto sopra e restituisce anche la posizione dell'utente. Ecco il link: https://www.dropbox.com/s/2mkyjok6mpna2yw/GPS.java?dl=0.

+1

Benvenuti in SO e grazie per aver risposto a una domanda. Aggiungi contesto alla tua risposta oltre al codice. –

+0

Dovrò provare questa soluzione quando torno perché ho bisogno di partire presto. La mia domanda per Arnold è la verifica è per confermare che l'utente non ha spento i loro servizi di localizzazione? Non che il manifest abbia usi-permesso? – Airagale

+0

Il tuo file manifest va bene, non è necessario aggiungere o eliminare nulla (forse basta mettere i tag di permesso prima dei tag dell'applicazione, ma non sono sicuro che sia un problema). Devi controllare prima se il permesso è stato concesso dall'utente (Non che l'utente abbia abilitato i servizi di localizzazione), e poi se ti ha concesso il permesso di usare la sua posizione controlla se ha abilitato i servizi di localizzazione. Basta controllare il file che ho messo sul link sopra e vedrai che hai tutto lì. –

Problemi correlati