ACCESS_FINE_LOCATION Разрешения AndroidManifest не предоставляются - PullRequest
17 голосов
/ 12 июля 2011

Я пытаюсь использовать GPS в Android (2.2 и 2.3), но при попытке использовать объект LocationManager получаю следующую ошибку:

WARN/System.err(522): java.lang.SecurityException: Provider network requires ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission

Я исследовал проблему в других публикациях, и они, как правило, связаны с проблемами с AndroidManifest.xml. Тем не менее, моя, кажется, в порядке:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.thedigitalsean.examples"
  android:versionCode="1"
  android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".GetLocation"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
<uses-permission android:name="android.permisssion.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permisssion.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permisssion.INTERNET"></uses-permission>
</manifest>

Вот неправильная строка кода в моем методе onCreate в GetLocation Activity, заключенная в блок try / catch:

* * 1010

Это первое написанное мною приложение, в котором мне нужно запрашивать разрешения для Android, и до сих пор не удалось получить какие-либо разрешения. Что-то мне не хватает в моем манифесте или, возможно, в моей конфигурации затмения?

Ответы [ 3 ]

59 голосов
/ 12 июля 2011

Вы допустили ошибку с ошибкой

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
16 голосов
/ 09 июня 2015

У меня была такая же проблема, и я не мог понять, что я делаю неправильно. Оказывается, автозаполнение для Android Studio изменяло текст на все прописные или строчные буквы (в зависимости от того, набирал ли я прописные или строчные слова перед автозаполнением). ОС не регистрирует имя из-за этой проблемы, и я получу ошибку, касающуюся пропущенного разрешения. Как указано выше, убедитесь, что ваши разрешения помечены правильно:

Корректное

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

Некорректное

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

Некорректное

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

Хотя это может показаться тривиальным, его легко не заметить.

Если есть какие-либо настройки, чтобы сделать разрешения не чувствительными к регистру, добавьте комментарий с инструкциями. Спасибо!

8 голосов
/ 27 июля 2016

Совместим со всеми версиями SDK (android.permission.ACCESS_FINE_LOCATION стало разрешением dangerous в Android M и требует, чтобы пользователь предоставил его вручную).

В версиях Android ниже Android M ContextCompat.checkSelfPermission(...) всегда возвращает true, если добавить эти разрешения в AndroidManifest.xml)

public void onSomeButtonClick() {
    ...
    if (!permissionsGranted()) {
        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 123);
    } else doLocationAccessRelatedJob();
    ...
}

private Boolean permissionsGranted() {
    return ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
}

@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 123) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission granted.
            doLocationAccessRelatedJob();
        } else {
            // User refused to grant permission. You can add AlertDialog here
            Toast.makeText(this, "You didn't give permission to access device location", Toast.LENGTH_LONG).show();
            startInstalledAppDetailsActivity();
        }
    }
}

private void startInstalledAppDetailsActivity() {
    Intent i = new Intent();
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    i.addCategory(Intent.CATEGORY_DEFAULT);
    i.setData(Uri.parse("package:" + getPackageName()));
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
}

в AndroidManifest.xml:

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