ACCESS_FINE_LOCATION AndroidManifest权限未被授予

the*_*ean 17 permissions gps android location android-manifest

我正在尝试在Android(2.2和2.3)中使用GPS,但在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

以下是GetLocation Activity中我的onCreate方法中令人讨厌的代码行,包含在try/catch块中:

    LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    final LocationListener locListener = new MyLocListener();

    try{
        locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
    }
    catch (SecurityException se){
        ((TextView)findViewById(R.id.infobox)).setText(se.toString());
        se.printStackTrace();
    }
Run Code Online (Sandbox Code Playgroud)

这是我写的第一个应用程序,我需要请求Android权限,到目前为止,在获得任何权限方面都没有成功.在我的清单中或者在我的日食配置中是否有我遗漏的东西?

atr*_*des 60

你错误的许可

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

  • 令人尴尬,但就是这样.谢谢! (10认同)

Slo*_*pes 16

我遇到了同样的问题,无法弄清楚我做错了什么.事实证明,Android Studio的自动完成功能正在将文本更改为全部大写或全部小写(取决于我是否在自动完成之前键入大写或更低级别的演员).由于此问题,操作系统未注册名称,我将收到有关缺少权限的错误.如上所述,确保您的权限标记正确:

正确:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

不正确:

<uses-permission android:name="ANDROID.PERMISSION.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)

不正确:

<uses-permission android:name="android.permission.access_fine_location" />
Run Code Online (Sandbox Code Playgroud)

虽然这看似微不足道,但很容易被忽视.

如果有一些设置使权限不区分大小写,请在说明中添加注释.谢谢!


Rus*_*zov 8

所有的SDK版本兼容(android.permission.ACCESS_FINE_LOCATION成为dangerous在版本的Android M许可,需要用户手动授予它).

在Android的版本以下版本的Android M ContextCompat.checkSelfPermission(...)总是返回true如果添加这些权限(S) 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);
}
Run Code Online (Sandbox Code Playgroud)

在AndroidManifest.xml中:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)