2015-09-11 10 views
5

Sono completamente nuovo nello sviluppo di Android, ma ho già lavorato con Java (e altri linguaggi di programmazione).Perché le autorizzazioni AndroidManifest non sono impostate nella mia applicazione

Utilizzo Android Studio per sviluppare la mia applicazione e mi sono bloccato nel seguire il tutorial dello sviluppatore sull'accesso alle informazioni sulla posizione (http://developer.android.com/training/location/index.html). Capisco che i servizi di localizzazione richiedono l'android.permission.ACCESS_COARSE_LOCATION e/o android.permission.ACCESS_FINE_LOCATION i permessi, ma su di loro aggiungendo alla mia ApplicationManifest la mia domanda ancora blocca con un SecurityException

java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations. 

ho incontrato diversi altri casi di persone che hanno problemi, ma questi sono stati generalmente il risultato di un errato posizionamento (java.lang.SecurityException: Requires ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission), un'errata ortografia (ACCESS_FINE_LOCATION AndroidManifest Permissions Not Being Granted) o l'errata maiuscola della stringa di autorizzazione.

Ecco il mio ApplicationManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="scd.tt" > 

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

    <uses-sdk 
     android:minSdkVersion="14" 
     android:targetSdkVersion="23" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher_tt_v2" 
     android:label="@string/app_name" 
     android:theme="@style/TT_Theme"> 
     <activity 
      android:name=".MainActivity" 
      android:theme="@style/TT_Theme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".LoginActivity" android:theme="@style/TT_Theme.NoActionBar" /> 
     <activity android:name=".IndexActivity" /> 
    </application> 

</manifest> 

Ho anche provato per rimuovere ACCESS_NETWORK_STATE e Internet per vedere se questo potrebbe causare altri SecurityExceptions quanto non è necessaria l'applicazione per comunicare con un server HTTP (che esegue con successo) prima di ottenere i tentativi di ottenere informazioni sulla posizione.

Sembra che le modifiche apportate alle autorizzazioni per AndroidManifest non vengano aggiornate quando eseguo il programma. Ho anche provato a pulire e ricostruire l'applicazione utilizzando il menu Genera.

UPDATE:

Ecco il cuore della attività; Ho rimosso alcuni dei metodi indipendenti (come ad esempio onCreateOptionsMenu() e onBackPressed() in quanto hanno nulla a che fare con la posizione)

package scd.tt; 

import android.app.AlertDialog; 
import android.app.Fragment; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 

import java.util.Map; 

/** 
* Created by Liam on 08/09/2015 
*/ 
public class IndexActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

    private GoogleApiClient mGoogleApiClient; 
    private LocationRequest mLocationRequest; 
    private Location mLastLocation; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_index); 
     if(debug) Log.d(TAG, "onCreate() called: savedInstanceState is " + (savedInstanceState == null ? "null" : "not null")); 

     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10000); 
     mLocationRequest.setFastestInterval(1000); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
     buildGoogleApiClient(); 

     if (findViewById(R.id.index_fragment_container) != null) { 
      if (savedInstanceState != null) return; 

      Fragment index = new IndexFragment(); 
      index.setArguments(getIntent().getExtras()); 

      getFragmentManager().beginTransaction().add(R.id.index_fragment_container, index).commit(); 
     } 
    } 


    @Override 
    protected void onStart() { 
     super.onStart(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     mGoogleApiClient.disconnect(); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     if(debug) Log.d(TAG, "onConnected"); 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     startLocationUpdates(); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     if(debug) Log.d(TAG, "Connection Suspended"); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     if(debug) Log.d(TAG, "Connection Failed"); 
    } 

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

    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
     if(debug) Log.d(TAG, "buildGoogleAPIClient()"); 
    } 

    protected void startLocationUpdates() { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 
} 
+0

Stai eseguendo questo programma su un emulatore? – Actiwitty

+0

Che codice hai finora nella tua attività? – fractalwrench

+0

Sì, l'applicazione viene eseguita in un emulatore per il test. Si basa sul Nexus 5 su una piattaforma x86 utilizzando la versione API/SDK 23. –

risposta

1

controllare questi 3 collegamenti. Essi potrebbero aiutare -

  1. Android - Unable to get the gps location on the emulator
  2. ACCESS_FINE_LOCATION permission error emulator only
  3. http://www.gitshah.com/2011/02/android-fixing-no-internet-connection.html

Come citato da voi nei commenti -

permessi con un livello di protezione dei pericolosi devono essere concessi in fase di esecuzione richiamando l'utente a partire dall'SDK 23 e non può essere definito solo nel Manifesto più.

Problemi correlati