Problemas de permiso para la ubicación en android Marshmallow applicaton

Estoy aprendiendo a desarrollar una aplicación de Android para obtener la ubicación del dispositivo siguiente foro de desarrolladores de Google: @ http://developer.android.com/training/location/retrieve-current.html#last-known @ http://developer.android. com / training / location / receive-location-updates.html

El ejemplo muestra cómo usar Google PLay Services para este propósito. Pero la función getLastLocation() devuelve siempre null.

Ubicación location = LocationServices.FusedLocationApi.getLastLocation (mGoogleApiClient);

Como inicialmente la ubicación podría ser nula, agregué las siguientes líneas para recibir actualizaciones de ubicación periódicas

LocationServices.FusedLocationApi.requestLocationUpdates (mGoogleApiClient, mLocationRequest, this);

que lanza una excepción con el siguiente mensaje

El cliente debe tener permiso ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION para realizar cualquier operación de ubicación

Ya he añadido los permisos en el archivo de manifiesto:

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

He abierto Google Maps para actualizar la ubicación actual en Google Play Service, pero el mismo problema persiste. Soy novato en el desarrollo de Android, y antes de publicar esta pregunta ya he buscado mucho, pero no encontré ninguna solución que funcione para mí. Lo estoy probando en el dispositivo Android Marshmallow , desarrollando Android Studio 1.3.2

AndroidManifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="newray.acpsa1"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="@string/google_maps_key" /> <activity android:name=".MapsActivity" android:label="@string/title_activity_maps"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

onCreate función en la actividad

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); mLocationRequest = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(10 * 1000) .setFastestInterval(1 * 1000); /* Rest functionality */ } 

onConnected función

 @Override public void onConnected(Bundle bundle) { try{ Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); LatLng loc = new LatLng(21.356993, 72.826647); if (location == null) { Log.d(TAG,"location is again null"); LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); Log.d(TAG, "Requested for updates"); } else { loc = new LatLng(location.getLatitude(),location.getLongitude()); handleNewLocation(location); } } catch (Exception e) { Log.d(TAG, "Error in onConnected. "+e.getMessage()); } } 

Registros:

 XXXX: Error in onConnected. Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations. 

dependencias en archivo build.gradle:

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.0' compile 'com.google.android.gms:play-services:8.1.0' compile 'com.google.android.gms:play-services-location:8.1.0' } 

En Marshmallow hay muchas cosas nuevas en android SDK. Pedir el permiso es una de las nuevas actualizaciones que cada desarrollador debe tener en cuenta. Lo mismo sucede contigo. si su aplicación de destino versión 23, entonces probablemente debería tener que tomar la concesión del usuario antes de empezar a utilizarlo. Sólo se puede utilizar si el usuario permite a access.Therefor desarrollador necesidad de cuidar todo el caso de prueba, mientras que el permiso del usuario en la aplicación

Por ejemplo, su aplicación necesita el acceso de la ubicación. En la versión anterior de Android en el momento de instalarlo era mostrar el diálogo de permiso y se les concedió el permiso definido en su archivo de manifiesto a la aplicación. Estas cosas se transformaron en la melcocha. Ahora cada aplicación debe tener que tomar el permiso del usuario para acceder al mismo.

Consulte los sitios de desarrolladores y conozca los pasos básicos para guiar al usuario en la aplicación para solicitar el runtime permission en la aplicación.

Hay un montón de sitios que muestran su tutorial básico acerca de cómo pedir el permiso en Marshmallow. pocos pueden sugerir lo siguiente

Construcción de una mejor aplicación con permiso de ejecución

Guía de diseño de permisos

Este enlace le guía la información básica de cómo guiar al usuario en la aplicación antes de solicitar el permiso.

Gracias.

Solución directa / ejemplo para su pregunta:

 package com.my.packagename; import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE_LOCATION = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (checkPermission(Manifest.permission.ACCESS_FINE_LOCATION,getApplicationContext(),CopyOfMap.this)) { fetchLocationData(); } else { requestPermission(Manifest.permission.ACCESS_FINE_LOCATION,PERMISSION_REQUEST_CODE_LOCATION,getApplicationContext(),CopyOfMap.this); } } public static void requestPermission(String strPermission,int perCode,Context _c,Activity _a){ if (ActivityCompat.shouldShowRequestPermissionRationale(_a,strPermission)){ Toast.makeText(getApplicationContext(),"GPS permission allows us to access location data. Please allow in App Settings for additional functionality.",Toast.LENGTH_LONG).show(); } else { ActivityCompat.requestPermissions(_a,new String[]{strPermission},perCode); } } public static boolean checkPermission(String strPermission,Context _c,Activity _a){ int result = ContextCompat.checkSelfPermission(_c, strPermission); if (result == PackageManager.PERMISSION_GRANTED){ return true; } else { return false; } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case PERMISSION_REQUEST_CODE_LOCATION: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { fetchLocationData(); } else { Toast.makeText(getApplicationContext(),"Permission Denied, You cannot access location data.",Toast.LENGTH_LONG).show(); } break; } } private void fetchLocationData() { //code to use the granted permission (location) } } 

Aquí he hecho el requestPermission () y el método checkPermission () como estático público porque puedo reutilizarlos para otras solicitudes de permisos como llamadas telefónicas, almacenamiento de escritura y otros. Espero que esto ayude a alguien. Todos los derechos reservados

  • Dar localización falsa al emulador de Genymotion
  • La API de ubicación de Google Play Service devuelve una ubicación incorrecta a veces
  • Detectar o impedir si el usuario utiliza una ubicación falsa
  • LocationClient no se puede resolver con un tipo
  • Bug in Android Geofence Código de ejemplo? ¿Puede alguien confirmar?
  • El oyente de ubicación funciona desde un servicio pero no es un servicio de IntentService
  • Cómo obtener sellos horarios precisos desde la ubicación GPS de Android
  • obtener la ubicación actual (gps / wifi)
  • Emulador de Android se reinicia cuando se envía una ubicación falsa
  • La aplicación de Android no puede acceder a la ubicación en el emulador mediante FusedLocationApi
  • Convertir la ubicación en GeoPoint
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.