引起:java.lang.SecurityException:"被动"位置提供程序需要ACCESS_FINE_LOCATION权限

时间:2017-03-19 16:55:20

标签: java android

我已经看过其他帖子中有这个错误,其中一个解决方法是他们拼错了#34;许可"我在this帖子中添加了另一个解决方案,虽然它导致我的应用程序没有崩溃,但它导致它退出,因为我没有被授予权限。

这是我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.turtl.decider">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.hardware.location.gps"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我添加了精确的位置和粗略的位置权限以确保安全。

这是导致错误的代码:

   private void getLocation() throws SecurityException {
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (isPermissionGranted("ACCESS_FINE_LOCATION",context)) {
            loc = locationManager.getLastKnownLocation(locationProvider);
        } else {
            showAlert("Insufficent Permissions", "Please grant this app GPS permissions to continue.");
        }
    }

我从我链接到的解决方案中复制的代码:

public static boolean isPermissionGranted(String permission, Context c) {
    //int res = ContextCompat.checkSelfPermission(context, permission);
    return (ContextCompat.checkSelfPermission(c, permission) == PackageManager.PERMISSION_GRANTED);
}

我在Nexus 6p模拟器上使用Android API级别24。就像我说的那样,检查是否授予了权限会导致应用程序不会崩溃,因为它会跳过该行,但它只是退出。

我在我的个人设备(API 23)上运行它,结果相同。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

错误#1:isPermissionGranted("ACCESS_FINE_LOCATION",context)不正确,因为这不是正确的字符串。使用isPermissionGranted(Manifest.permission.ACCESS_FINE_LOCATION, context)拉入正确的字符串。

错误#2:<uses-permission android:name="android.hardware.location.gps"/>应为<uses-feature android:name="android.hardware.location.gps"/>,因为该名称没有权限,但该名称有硬件功能。

此外,您最终需要致电requestPermissions()以请求Manifest.permission.ACCESS_FINE_LOCATION,因为您的应用不会保留它。