Android 9.0如何读取外置SD卡权限?

在 Android 9.0(Pie)及以上版本中,读取外置 SD 卡的权限管理比以前更加严格。Android 9.0 引入了更多的权限控制,以提高用户的隐私和安全。因此,你需要遵循新的权限模型来访问外部存储。以下是详细的步骤和代码示例,帮助你获取和读取外置 SD 卡的权限。

1. 更新 AndroidManifest.xml

在 AndroidManifest.xml 中,声明必要的权限。为了读取外置 SD 卡,你需要申请 READ_EXTERNAL_STORAGE 权限。此外,添加 REQUEST_INSTALL_PACKAGES 权限以获取对 SD 卡的读取权限。

xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yourapp"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 添加对 SD 卡权限的要求 --> <application ... > ... </application> </manifest>

2. 请求权限

从 Android 6.0(Marshmallow)及以上版本,你需要在运行时请求权限。以下代码演示了如何在活动中请求和检查权限:

java
private static final int REQUEST_PERMISSION_CODE = 1; // 检查权限并请求权限 private void checkPermissions() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 权限未被授予,申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE); } else { // 权限已被授予,执行读取操作 readExternalStorage(); } } // 处理权限请求结果 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限授予,执行读取操作 readExternalStorage(); } else { // 权限被拒绝 Toast.makeText(this, "Permission denied to read external storage", Toast.LENGTH_SHORT).show(); } } }

3. 读取外置 SD 卡

读取外置 SD 卡的文件可以通过 File 类完成。首先,你需要获得外部存储的路径。使用 Environment.getExternalFilesDirs(null) 来获取 SD 卡路径。

java
import android.os.Environment; import java.io.File; private void readExternalStorage() { // 获取外部存储路径 File[] externalDirs = ContextCompat.getExternalFilesDirs(this, null); if (externalDirs.length > 1) { // 在 Android 9.0 及以上,外部存储目录包含内部存储和 SD 卡 File sdCard = externalDirs[1]; // SD 卡路径 File file = new File(sdCard, "example.txt"); if (file.exists()) { // 读取文件内容 try (BufferedReader br = new BufferedReader(new FileReader(file))) { String line; while ((line = br.readLine()) != null) { Log.d("FileContent", line); } } catch (IOException e) { e.printStackTrace(); } } else { Log.d("FileRead", "File does not exist."); } } else { Log.d("FileRead", "SD card not found."); } }

4. 使用 Storage Access Framework(可选)

对于 Android 10(Q)及以上版本,访问文件的推荐方式是使用 Storage Access Framework。虽然 Android 9.0 支持传统的文件访问方法,但你也可以考虑使用 Storage Access Framework 来提高兼容性和用户体验。

5. 权限说明

  • READ_EXTERNAL_STORAGE:读取外部存储的权限。
  • WRITE_EXTERNAL_STORAGE:写入外部存储的权限。通常需要在运行时请求,并且在 Android 10 及以上版本中,建议使用 Storage Access Framework 进行文件操作。

总结

在 Android 9.0 中读取外置 SD 卡,需要在 AndroidManifest.xml 中声明权限,并在运行时请求这些权限。通过使用 File 类读取外置 SD 卡的文件,并检查 ContextCompat.getExternalFilesDirs 方法获取的外部存储路径来定位 SD 卡。对于 Android 10 及以上版本,推荐使用 Storage Access Framework 进行文件访问。

关键字

Android 9.0,外置 SD 卡,读取权限,READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE,运行时权限,File 类,ContextCompat.getExternalFilesDirsStorage Access Framework