在android中,为什么我得到一个`ACCESS_FINE_LOCATION`需要错误,尽管已经定义了?

时间:2017-02-27 02:17:53

标签: android gps

我收到此错误:

java.lang.RuntimeException: Unable to create application com.android.tools.fd.runtime.BootstrapApplication: java.lang.SecurityException: "gps" location provider requires ACCESS_FINE_LOCATION permission.

在我的Android代码中,尽管有:

<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"/>
在我的manifest.xml中

这是导致错误的代码。它被包装以检查权限,但if中的第一行仍会导致该错误。

LocationManager mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 1, mLocationListener);
}

我之前也定义了LocationListener onLocationChanged事件。

我是否需要添加其他任何内容来修复此异常?

2 个答案:

答案 0 :(得分:0)

LocationManager mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 1, mLocationListener);
}

如果未授予权限,则需要requestPermission

答案 1 :(得分:0)

您应该在运行时为运行Android 6.0及更高版本的设备请求权限。以下是样本

private String locationPermission = Manifest.permission.ACCESS_FINE_LOCATION;
if (ActivityCompat.checkSelfPermission(MainActivity.this, locationPermission)
    == PackageManager.PERMISSION_GRANTED) {
  mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 1, mLocationListener);
} else {
  ActivityCompat.requestPermissions(MainActivity.this,
      new String[] { locationPermission }, PR_LOCATION_REQUEST);
}

并处理权限授予结果

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
  @NonNull int[] grantResults) {
if (requestCode != PR_LOCATION_REQUEST) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  return;
}
if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
   mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 1, mLocationListener);
  return;
}
}

有关详细信息https://developer.android.com/training/permissions/requesting.html

,请参阅此处