首页 > 代码库 > 系统权限

系统权限

声明权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.snazzyapp">

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

    <application ...>
        ...
    </application>

</manifest>

 

运行时请求权限

自从安卓6.0起,需要授予权限在程序运行时而不是安装程序时。

 系统权限又分为两种

  • 正常权限

     该种权限系统自动授权许可

  • 危险权限

     该种权限必须用户显式的授权

 

1、检查权限

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);

 

如果具有该权限,那么该函数返回 PackageManager.PERMISSION_GRANTED,否则返回 PERMISSION_DENIED,

 

2、请求权限

如果用户曾拒绝请求,再次需要权限时,可以通过 shouldShowRequestPermissionRationale() 用来解释为何使用该权限(比如弹出个对话框),再次询问是否授权

通过 requestPermissions() 授予权限,该函数会打开一个对话框让用户授权或拒绝,需要传入一个整型请求标识,以及请求的权限,该函数是异步的

// 检查是否有该权限
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // 是否需要解释,在拒绝一次后再次请求时会返回true
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don‘t block
        // this thread waiting for the user‘s response! After the user
        // 看过解释后再次请求权限

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

 

 

3、 处理授权

在 requestPermissions() 打开的对话框关闭后,系统会调用 onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 来处理授权结果

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // 授权成功,授权后的操作

            } else {

                // 拒绝授权,提示运行需要该权限
            }
            return;
        }

        // other ‘case‘ lines to check for other
        // permissions this app might request
    }
}

 

系统权限