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);
}
}
Stai eseguendo questo programma su un emulatore? – Actiwitty
Che codice hai finora nella tua attività? – fractalwrench
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. –