Каждый раз, когда я запускаю приложение, выдается исключение SecurityException, а ошибка отладчика выглядит так:
java.lang.SecurityException: поставщику местоположения "gps" требуется разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION.
Это кажется простой ошибкой, однако мой файл манифеста полностью верен. Вот он, а вот и мой код MapActivity:
<?xml version="1.0" encoding="utf-8"?>
<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" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.dev.cromer.jason.coverme.permission.MAPS_RECEIVE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<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=".MapActivity"
android:label="@string/title_activity_map" >
</activity>
</application>
Моя деятельность:
package com.dev.cromer.jason.coverme;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapActivity extends FragmentActivity implements LocationListener {
private GoogleMap mMap; // Might be null if Google Play services APK is not available.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
//mMap.setMyLocationEnabled(true);
//mMap.setOnMyLocationChangeListener(this);
setUpMap();
}
}
}
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
mMap.setMyLocationEnabled(true);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
try {
Location myLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (myLocation != null) {
Log.d("TAG", "Not null");
}
else {
Log.d("TAG", "NULL");
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
}
catch (SecurityException se) {
Log.d("TAG", "SE CAUGHT");
se.printStackTrace();
}
}
@Override
public void onLocationChanged(Location location) {
Log.d("CHANGED", "LOCATION UPDATED");
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
Ответы:
ACCESS_COARSE_LOCATION
,ACCESS_FINE_LOCATION
иWRITE_EXTERNAL_STORAGE
являются частью системы разрешений времени выполнения Android 6.0 . Помимо того, что они присутствуют в манифесте, как и вы, вы также должны запросить их у пользователя во время выполнения (используяrequestPermissions()
) и посмотреть, есть ли они у вас (используяcheckSelfPermission()
).Одним из краткосрочных решений является снижение вашего показателя
targetSdkVersion
ниже 23.Но, в конце концов, вы захотите обновить свое приложение, чтобы использовать систему разрешений времени выполнения.
Например, это действие работает с пятью разрешениями. Четыре - это разрешения времени выполнения, хотя в настоящее время он обрабатывает только три (я писал, что он
WRITE_EXTERNAL_STORAGE
был добавлен в список разрешений времени выполнения).(из этого примера проекта )
Я бы использовал константы, определенные на
Manifest.permission
, как показано выше.Он будет передан вам в качестве первого параметра
onRequestPermissionsResult()
, чтобы вы могли отличить одинrequestPermissions()
вызов от другого.источник
targetSdkVersion
23 или выше. На этом этапе вам нужно будет принять систему разрешений времени выполнения. Пока не наступит это время, вы можете оставить свой уровеньtargetSdkVersion
ниже 23 и игнорировать разрешения на выполнение.Мое простое решение - это
или вы можете открыть диалоговое окно разрешения в другом, например, этом
источник
ПРИЧИНА: «Начиная с Android 6.0 (уровень API 23), пользователи предоставляют разрешения приложениям во время работы приложения, а не при его установке». В этом случае «ACCESS_FINE_LOCATION» является «опасным разрешением, и по этой причине вы получаете это 'java.lang.SecurityException: поставщик местоположения« gps »требует разрешения ACCESS_FINE_LOCATION». ошибка ( https://developer.android.com/training/permissions/requesting.html ).
РЕШЕНИЕ. Реализация кода, предоставленного на https://developer.android.com/training/permissions/requesting.html под заголовками «Запросить необходимые разрешения» и «Обработать ответ на запрос разрешений».
источник