Android中的权限

Android 6.0及以上版本采用了新的权限机制,将权限分为两类。

  • Normal Permissions

    这类权限一般不涉及用户隐私,不需要用户进行动态授权,只需要在AndroidManifest.xml中声明即可使用,比如使用蓝牙和访问网络等(安装时权限

  • Dangerous Permissions

    一般涉及用户隐私,除了需要在AndroidManifest.xml中声明,还需要在运行时,进行动态权限申请,由用户进行授权,比如打电话和发短信等(运行时权限

    需要动态申请的权限如下:

权限处理流程

Android中的权限

2021-02-04-001

声明应用权限

安装时的权限,在清单文件中进行配置,参见 声明应用权限

申请运行时权限

对于运行时权限,需要在代码中请求,参见 请求应用权限

        if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
                PackageManager.PERMISSION_GRANTED) {
            // 已获得授权,可以调用API
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            // 向用户说明为什么您的应用需要此权限才能使特定功能正常运行。
            // 在此用户界面中,添加“取消”或“不,谢谢”按钮,
            // 该按钮允许用户在不授予许可的情况下继续使用您的应用
//            showInContextUI(...);
        } else {
            // 请求权限
            requestPermissions(mContext, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
                    REQUEST_CODE);
        }

在Activity中实现回调

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE:
            // 如果取消请求,则结果数组为空。
            if (grantResults.length > 0 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 已授予权限,进行下步
            }  else {
                // 向用户说明该功能不可用,因为该功能需要用户拒绝的权限。
            }
            return;
    }
    // 其他case用以检查可能请求的其他权限
}

EasyPermissions

EasyPermissions 是一个方便开发者的简单高效处理运行时权限的库。EasyPermissions GitHub地址

public class TestActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 检查是否具有指定的权限
        if (!EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            // 请求权限
            EasyPermissions.requestPermissions(this, "权限弹窗上的提示语",1001,Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
    }

    /**
     * 重写 onRequestPermissionsResult,用于接受请求结果
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       //将请求结果传递给EasyPermission库处理
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    /**
     * 请求权限成功
     *
     * @param requestCode
     * @param perms
     */
    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        // 用户授权成功
        Log.d("TestActivity","onPermissionsGranted");
    }


    /**
     * 请求权限失败
     *
     * @param requestCode
     * @param perms
     */
    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        Log.d("TestActivity","onPermissionsDenied");
        /**
         * 若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。
         * 这时候,需要跳转到设置界面去,让用户手动开启。
         */
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
           new AppSettingsDialog.Builder(this).build().show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        //当从软件设置界面返回时
        case AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE:
            Log.d("TestActivity","onActivityResult");
            Log.d("TestActivity","hasPermissions="+EasyPermissions.hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE));
             break;
        }
    }
}

附录:

运行时权限

group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
permission:android.permission.CAMERA

group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS

关于Android中的所有权限列表,查阅权限文档

Android中的权限机制说明,可查阅官方文档 权限概览


公众号“编程之路从0到1”

20190301102949549

Copyright © Arcticfox 2021 all right reserved,powered by Gitbook文档修订于: 2022-05-01 12:20:20

results matching ""

    No results matching ""