【问题标题】:Call requires API level 23 (current min is 14): android.app.Activity#requestPermissions,checkSelfPermission [duplicate]调用需要 API 级别 23(当前最低为 14):android.app.Activity#requestPermissions,checkSelfPermission [重复]
【发布时间】:2016-06-16 17:46:56
【问题描述】:

我正在尝试添加运行时权限 android(6.0.1) API 23,如果我使用 SDK 版本(min 和目标版本均为 23)它可以正常工作,如下所示,

    <uses-sdk
                android:minSdkVersion="23"
                android:targetSdkVersion="23" />

如果我更改 android:minSdkVersion(小于 23)

例如:

我收到以下错误:

调用需要 API 级别 23(当前最低为 14): android.app.Activity#requestPermissions,checkSelfPermission

对于以下2种方法,

1)requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS)

2)checkSelfPermission(permission)

我试过ActivityCompat.checkSelfPermission()ContextCompat.checkSelfPermission() 都不起作用。

我错过了什么无法理解..

【问题讨论】:

  • ContextCompat.checkSelfPermission() 正是您想要的,您能否更具体地说明它为什么不起作用?
  • 您在使用 ActivityCompat 或 ContextCompat 时是否遇到任何错误?如果是,是什么错误?
  • 以下是我在使用 ActivityCompat 时遇到的错误“ActivityCompat 类型的方法 checkSelfPermission(String) 未定义”
  • 不是 ActivityCompat,是 ContextCompat。
  • @Egor 这个代码我正在使用 ContextCompat.requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);以下是我得到的错误,“ContextCompat 类型的方法 requestPermissions(String[], int) 未定义”

标签: android android-support-library android-permissions android-6.0-marshmallow


【解决方案1】:

检查目标 >=23 或简单地在您的方法上方添加以下行

@TargetApi(Build.VERSION_CODES.M)

例如,如果你正在检查存储权限,那么你可以参考这个函数,

@TargetApi(Build.VERSION_CODES.M)
    public boolean CheckStoragePermission() {
        int permissionCheckRead = ContextCompat.checkSelfPermission(context,
                Manifest.permission.READ_EXTERNAL_STORAGE);
        if (permissionCheckRead != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
                    Manifest.permission.READ_EXTERNAL_STORAGE)) {
                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
                ActivityCompat.requestPermissions((Activity) context,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        Define.PERMISSION_STORAGE);
            } else {
                // No explanation needed, we can request the permission.

                ActivityCompat.requestPermissions((Activity) context,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        Define.PERMISSION_STORAGE);

                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
            return false;
        } else
            return true;
    }

【讨论】:

  • 感谢您的解决方案也有效 :)
  • 我在哪里可以添加代码来处理用户拒绝权限的情况,比如退出应用程序?
【解决方案2】:

检查权限:

ContextCompat.checkSelfPermission(Context context, String permission)

请求权限:

ActivityCompat.requestPermissions(Activity activity, String[] permissions, int requestCode)

或在 support-v4 中 Fragment

requestPermissions(String[] permissions, int requestCode)

【讨论】:

    【解决方案3】:

    试试这个方法

    if (Build.VERSION.SDK_INT >= 23) {
        if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)
                    != PackageManager.PERMISSION_GRANTED) {
                requestContactsPermissions1();
        } else {
            // your code
        }
    }
    

    已编辑:

    在较低级别(您的应用)build.gradle 中添加依赖项块:

    compile 'com.android.support:appcompat-v7:23.1.1'
    

    或仅在您需要设计支持库时添加以下内容

    compile 'com.android.support:design:23.1.1'
    

    使用上述之一

    【讨论】:

    • 以下是我在使用 ActivityCompat 时遇到的错误“ActivityCompat 类型的方法 checkSelfPermission(String) 未定义”
    • @Joe:检查已编辑的答案
    • 我认为最好使用更简单的替代方法 - 只需使用 @TargetApi(23) 注释类或方法,因为在 API 版本上自动授予少于 23 个权限,因此条件块没有意义。所以任何建议条件替代的人都有无用的代码缩进和可能无用的“else”块。
    【解决方案4】:

    这是因为在 API 23 中添加了checkSelfPermission()。所以你必须有条件地编码:

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
        //use checkSelfPermission()
    } else {
        //simply use the required feature
        //as the user has already granted permission to them during installation
    }
    

    【讨论】:

    • 以下是我在使用 ActivityCompat 时遇到的错误“ActivityCompat 类型的方法 checkSelfPermission(String) 未定义”
    • @Joe 你看过这个吗? stackoverflow.com/a/34613112/5352802
    • 看来我也有同样的问题,我用的是eclipse,请问如何添加,请详细说明。
    • 谢谢你解决了我的问题:)
    【解决方案5】:

    调用请求权限前检查设备sdk

     if(Build.VERSION.SDK_INT==Build.VERSION_CODES.M)
    {
    //call the request permission here 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多