Setiap kali saya menjalankan aplikasi, SecurityException saya dilempar dan kesalahan dari debugger berbunyi sebagai berikut:
java.lang.SecurityException: penyedia lokasi "gps" memerlukan izin ACCESS_COARSE_LOCATION atau ACCESS_FINE_LOCATION.
Ini sepertinya kesalahan sederhana, namun file manifes saya sepenuhnya benar. Ini dia, dan ini juga kode MapActivity saya:
<?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>
Aktivitas Saya:
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) {
}
}
Jawaban:
ACCESS_COARSE_LOCATION
,,ACCESS_FINE_LOCATION
danWRITE_EXTERNAL_STORAGE
merupakan bagian dari sistem izin waktu proses Android 6.0 . Selain memilikinya di manifes seperti yang Anda lakukan, Anda juga harus memintanya dari pengguna pada waktu proses (menggunakanrequestPermissions()
) dan melihat apakah Anda memilikinya (menggunakancheckSelfPermission()
).Salah satu solusi dalam jangka pendek adalah menurunkan angka di
targetSdkVersion
bawah 23.Namun, pada akhirnya, Anda ingin memperbarui aplikasi Anda untuk menggunakan sistem izin waktu proses.
Misalnya, aktivitas ini bekerja dengan lima izin. Empat adalah izin waktu proses, meskipun saat ini hanya menangani tiga (saya menulisnya sebelum
WRITE_EXTERNAL_STORAGE
ditambahkan ke daftar izin waktu proses).(dari proyek sampel ini )
Saya akan menggunakan konstanta yang ditentukan pada
Manifest.permission
, seperti yang ditunjukkan di atas.Itu akan dikembalikan kepada Anda sebagai parameter pertama ke
onRequestPermissionsResult()
, sehingga Anda bisa membedakan saturequestPermissions()
panggilan dari yang lain.sumber
targetSdkVersion
ke 23 atau lebih tinggi. Pada tahap itu, Anda perlu mengadopsi sistem izin waktu proses. Sampai waktunya tiba, Anda dipersilakan untuk mempertahankan ditargetSdkVersion
bawah 23 dan mengabaikan izin runtime.Solusi sederhana saya adalah ini
atau Anda dapat membuka dialog izin di tempat lain seperti ini
sumber
PENYEBAB: "Mulai Android 6.0 (API level 23), pengguna memberikan izin ke aplikasi saat aplikasi berjalan, bukan saat mereka menginstal aplikasi." Dalam kasus ini, "ACCESS_FINE_LOCATION" adalah "izin berbahaya dan untuk alasan itu, Anda mendapatkan 'java.lang.SecurityException: penyedia lokasi" gps "memerlukan izin ACCESS_FINE_LOCATION.' kesalahan ( https://developer.android.com/training/permissions/requesting.html ).
SOLUSI: Menerapkan kode yang disediakan di https://developer.android.com/training/permissions/requesting.html di bawah judul "Minta izin yang Anda perlukan" dan "Tangani respons permintaan izin".
sumber