Android存储权限详解
一、Android存储权限
在Android操作系统中,存储权限是应用与设备存储交互的基础,随着Android版本的更新,Google对存储权限的管理进行了多次优化和调整,以增强用户体验和数据安全,从Android 6.0(API级别23)开始,存储权限被标记为危险权限,需要在运行时动态申请,而到了Android 11(API级别30),Google引入了分区存储机制,进一步加强了对存储权限的控制。
二、Android 10及以前的存储权限管理
权限声明
在AndroidManifest.xml文件中声明所需权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
动态申请权限
从Android 6.0(API级别23)开始,应用需要在代码中动态申请危险权限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); }
处理权限请求结果
覆盖onRequestPermissionsResult
方法处理用户响应:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限被授予 } else { // 权限被拒绝 } return; } } }
特殊注意事项
对于targetSdkVersion大于等于29的应用,还需要在AndroidManifest.xml中添加:
<application ... android:requestLegacyExternalStorage="true"> </application>
否则在Android 10设备上可能无法正常访问外部存储。
三、Android 11及以后的存储权限管理
分区存储
Android 11引入了分区存储机制,将存储分为应用专属存储区和公共共享存储区,应用默认只能访问自己的专属存储区,不能直接访问其他应用的数据。
新权限声明
除了READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE,还需要声明MANAGE_EXTERNAL_STORAGE权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
3. 动态申请MANAGE_EXTERNAL_STORAGE权限
由于MANAGE_EXTERNAL_STORAGE属于特殊权限,需要通过系统设置页面进行授权:
if (!Environment.isExternalStorageManager()) { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE); }
使用存储访问框架(SAF)
为了向后兼容,Android 11建议使用Storage Access Framework来访问公共存储中的文件,通过系统文件选择器让用户选择文件:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent, PICK_IMAGE_REQUEST);
处理分区存储的文件路径变化
Android 11中,应用专属存储路径发生变化,可以通过以下方式获取:
Context context = getApplicationContext(); File dir = context.getExternalFilesDir(null); File file = new File(dir, "example.txt");
四、归纳
Android的存储权限管理经历了从宽泛到严格的过程,体现了对用户隐私和数据安全的日益重视,开发者应紧跟Android版本更新,合理申请和使用存储权限,确保应用兼容性的同时保护用户数据安全,在实际开发中,建议采用分区存储的最佳实践,优先使用应用专属目录,必要时才通过存储访问框架访问公共存储,以提供更流畅、更安全的用户体验。