我在清单中设置权限,但必须在`marshmallow`中手动启用

时间:2016-02-19 15:54:09

标签: android android-studio permissions android-permissions

这是我的清单:

  <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CAMERA" />

这就是我项目所需要的全部内容,但我需要在代码中使用它,而不是在应用程序设置中手动。

1 个答案:

答案 0 :(得分:1)

要在Marshmallow中使用新的权限模型,您需要在清单中指定您的权限(就像您一样)并在运行时请求权限。只有被视为“危险”的权限才需要运行时请求。危险定义为:

  

提供请求申请的风险较高的权限   访问私人用户数据或控制可以的设备   对用户产生负面影响。因为这种类型的许可引入   潜在的风险,系统可能不会自动授予它   请求申请。例如,任何危险的权限   应用程序请求可以向用户显示并要求   在继续之前确认,或者可能采取其他一些方法   避免用户自动允许使用此类设施   来自:https://developer.android.com/guide/topics/manifest/permission-element.html

以下是检查您是否需要请求权限的代码示例。 (请记住,即使用户授予您的权限请求,他们也可以稍后在应用设置中撤消它,因此您需要在每次需要时进行检查。)

private final int REQUEST_PERMISSION_ACCESS_FINE_LOCATION=1;

private void requestAccessLocationPermission() {
    int permissionCheck = ContextCompat.checkSelfPermission(
            this, Manifest.permission.ACCESS_FINE_LOCATION);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {
            showExplanation("Permission Needed", "Rationale", Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_PERMISSION_ACCESS_FINE_LOCATION);
        } else {
            requestPermission(Manifest.permission.ACCESS_FINE_LOCATION, REQUEST_PERMISSION_ACCESS_FINE_LOCATION);
        }
    } else {
        Toast.makeText(MainActivity.this, "Permission (already) Granted!", Toast.LENGTH_SHORT).show();
    }
}

@Override
public void onRequestPermissionsResult(
        int requestCode,
        String permissions[],
        int[] grantResults) {
    switch (requestCode) {
        case REQUEST_PERMISSION_ACCESS_FINE_LOCATION:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(MainActivity.this, "Permission Granted!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_SHORT).show();
            }
    }
}