许可证未在清单中确认

时间:2016-06-13 21:12:17

标签: java android

我正在尝试为用户获取最后知道的位置。为此,我已经在manifest xml文件中声明了以下权限。

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

但是在代码中,它一直显示以下错误:

  

代码应明确检查是否有权限。

我没有看到这一点,但无论如何我添加了以下检查。

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }

这会停止显示错误,但是当我运行应用程序时,它最终会返回。我遗失了什么许可?自从我在Android上工作了一段时间后,我不记得必须处理这些额外的检查。清单许可声明就足够了。请告知我缺少的东西。

代码:

LocationManager locationManager;
String provider;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    provider = locationManager.getBestProvider(new Criteria(), false);
    Location location = null;

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        Log.i("location", "returned"); // This log will occur
        return; //return will occur
    }
    location = locationManager.getLastKnownLocation(provider); //this is the line that requires permission

    Log.i("location", "This log will not occur");
}

1 个答案:

答案 0 :(得分:3)

在Android 6.0中,权限授予和访问权限已更改。在清单中添加权限不再保证访问权限。用户现在有权在他选择时撤销并授予您权限。

您需要向用户明确请求某些权限。用户可以选择授予您权限,然后继续工作。用户也可以选择拒绝请求,然后你必须弄清楚如何处理这种情况。

授予的许可不是最终的。用户仍可以在以后稍后撤消权限,因此您必须跟踪您的权限。如果权限对应用程序的性能至关重要,请帮助用户了解在请求权限时应用程序正常运行(通过使用对话框/弹出窗口)必须具有权限。

为了更好地理解read this

您所做的就是检查您是否拥有必要的许可。 request for the permission

不是打破方法