如何取消最低API 23权限要求,将应用最低SDK版本降至17?
适配最低SDK 17的修改方案
1. 调整Gradle配置
直接修改模块级build.gradle文件中的配置即可,不需要受限于动态权限的要求:
- 将
minSdk参数值改为17 targetSdk、compileSdk可以保留现有高版本配置,不需要同步降级
你之前的认知误区是把动态权限适配的要求当成了minSdk的强制最低要求,实际上动态权限只需要targetSdk≥23即可,minSdk可以向下兼容到更低版本,只需要做好逻辑分层。
2. 补充权限申请的版本分支判断
Android 6.0(API23)以下的系统会在应用安装时默认授予清单中声明的所有权限,不需要动态申请,你需要在触发权限申请的代码位置补充版本判断逻辑:
首先确保AndroidManifest.xml中已经正常声明存储权限,所有系统版本都需要该配置:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
权限申请入口处的逻辑示例:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API23及以上系统走动态权限申请流程 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2000); } else { // API23以下系统默认已有权限,直接执行授权后的对应逻辑 if (this.blnStart) { callnext(); } else if (this.blnMyCreation) { callmycreation(); } }
3. 现有权限回调代码调整
你提供的onRequestPermissionsResult代码不需要做逻辑修改,仅需要调整注解即可:
- 将类上方的
@TargetApi(23)替换为@RequiresApi(api = Build.VERSION_CODES.M)
该回调方法仅会在API23及以上的系统中被触发,低版本不会执行到该部分代码,不会出现兼容问题。修改后的完整代码如下:
@RequiresApi(api = Build.VERSION_CODES.M) public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 2000: Map<String, Integer> perms = new HashMap(); perms.put("android.permission.WRITE_EXTERNAL_STORAGE", Integer.valueOf(0)); perms.put("android.permission.READ_EXTERNAL_STORAGE", Integer.valueOf(0)); if (grantResults.length > 0) { for (int i = 0; i < permissions.length; i++) { perms.put(permissions[i], Integer.valueOf(grantResults[i])); } if (((Integer) perms.get("android.permission.WRITE_EXTERNAL_STORAGE")).intValue() == 0 && ((Integer) perms.get("android.permission.READ_EXTERNAL_STORAGE")).intValue() == 0) { if (this.blnStart) { callnext(); return; } else if (this.blnMyCreation) { callmycreation(); return; } else { return; } } else if (ActivityCompat.shouldShowRequestPermissionRationale(this, "android.permission.WRITE_EXTERNAL_STORAGE") || ActivityCompat.shouldShowRequestPermissionRationale(this, "android.permission.READ_EXTERNAL_STORAGE")) { showDialogOK("Permission required for this app", new NewGlobe()); return; } else { Toast.makeText(this, "Go to settings and enable permissions", Toast.LENGTH_SHORT).show(); return; } } return; default: return; } }
完成以上三处修改后即可正常将最低适配版本降到17,同时保留高版本系统的动态权限适配逻辑。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

