【问题标题】:ACCESS_FINE_LOCATION AndroidManifest Permissions Not Being GrantedACCESS_FINE_LOCATION 未授予 AndroidManifest 权限
【发布时间】:2011-10-03 03:08:44
【问题描述】:

我正在尝试在 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>

这是 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();
    }

这是我编写的第一个需要请求 android 权限的应用程序,但迄今为止未能成功获得任何权限。我的清单或我的 Eclipse 配置中是否缺少某些内容?

【问题讨论】:

  • 请重新检查答案

标签: android permissions gps location android-manifest


【解决方案1】:

你拼错了权限

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

【讨论】:

  • 尴尬,但就是这样。谢谢!
  • 那么为什么它没有访问,即使你已经在清单中给予了所有权限。
【解决方案2】:

我遇到了同样的问题,无法弄清楚我做错了什么。事实证明,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" />

虽然这看起来微不足道,但很容易被忽视。

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

【讨论】:

    【解决方案3】:

    兼容所有 SDK 版本(android.permission.ACCESS_FINE_LOCATION 在 Android M 中变为dangerous 权限,需要用户手动授予)。

    在 Android M 以下的 Android 版本中,如果您在 AndroidManifest.xml 中添加这些权限,ContextCompat.checkSelfPermission(...) 始终返回 true)

    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" />
    

    【讨论】:

      【解决方案4】:

      只需从您使用 sss 的权限中删除 s,您必须使用 ss

      【讨论】:

        【解决方案5】:

        我有一个奇怪的问题,并意识到清单许可的文本末尾有一个空格字符。删除它,它工作得很好。

        之前

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

        之后

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-24
          • 2016-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多