
Android
Android M 运行时权限中的“Never-Asked”和“Stop-Asking”的区别
在 Android M(Android 6.0)及更高版本中,引入了运行时权限的概念,以增强用户对应用程序的控制能力。运行时权限允许应用在运行时请求访问敏感数据或执行敏感操作,例如访问相机、联系人或位置等。在用户安装应用后,他们可以选择授予或拒绝这些权限。而在运行时权限中,有两种状态可能会让开发者感到困惑,那就是“Never-Asked”(从未询问)和“Stop-Asking”(停止询问)。“Never-Asked”状态当应用首次请求一个权限时,如果用户选择了“拒绝”并勾选了“不再询问”选项,该权限将进入“Never-Asked”状态。这意味着用户明确拒绝了该权限,并且在将来的请求中不会再收到询问。对于这种权限,应用程序必须处理用户拒绝的情况,并提供替代的功能或解释为什么需要该权限。否则,如果应用程序在没有获得所需权限的情况下继续尝试访问受限资源,可能会导致应用程序崩溃或无法正常工作。为了处理“Never-Asked”状态,开发者可以使用shouldShowRequestPermissionRationale()方法来判断是否需要向用户解释权限的重要性。如果返回值为false,说明用户选择了“不再询问”选项,并且应该向用户展示一个解释对话框,以便他们了解为什么应用需要该权限。以下是一个示例代码,演示如何处理“Never-Asked”状态的权限请求:Java// 请求相机权限private static final int CAMERA_PERMISSION_REQUEST_CODE = 1;private void requestCameraPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { // 需要解释权限的重要性 showExplanationDialog(); } else { // 直接请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE); } } else { // 已经拥有权限 openCamera(); }}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 获得了相机权限 openCamera(); } else { // 用户拒绝了相机权限 handleCameraPermissionDenied(); } }}// 处理用户拒绝相机权限的情况private void handleCameraPermissionDenied() { // 可以显示一个对话框,引导用户前往应用设置中开启权限 // 或者提供替代的功能}“Stop-Asking”状态与“Never-Asked”状态不同,“Stop-Asking”状态表示用户选择了“拒绝”选项,但并没有勾选“不再询问”。这意味着用户仍然有机会在将来的请求中重新考虑授予权限。当权限处于“Stop-Asking”状态时,下一次请求将再次弹出权限对话框,让用户重新选择是否授予权限。在处理“Stop-Asking”状态时,开发者应该在每次请求权限之前,使用shouldShowRequestPermissionRationale()方法来检查是否应该向用户解释权限的重要性。如果返回值为true,说明用户之前选择了拒绝权限,但没有勾选“不再询问”,此时应该向用户解释为什么需要该权限。以下是一个处理“Stop-Asking”状态的示例代码:Java// 请求位置权限private static final int LOCATION_PERMISSION_REQUEST_CODE = 2;private void requestLocationPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { // 需要解释权限的重要性 showExplanationDialog(); } else { // 直接请求权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE); } } else { // 已经拥有权限 getLocation(); }}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 获得了位置权限 getLocation(); } else { // 用户拒绝了位置权限 handleLocationPermissionDenied(); } }}// 处理用户拒绝位置权限的情况private void handleLocationPermissionDenied() { // 可以显示一个对话框,向用户解释为什么需要位置权限 // 或者提供替代的功能}在 Android M 及更高版本中,了解和正确处理“Never-Asked”和“Stop-Asking”状态非常重要。通过使用shouldShowRequestPermissionRationale()方法,开发者可以根据不同的状态来向用户解释权限的重要性,并提供合适的反馈和替代功能,以确保应用程序在权限受限的情况下仍然能够正常工作。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号