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)及以上版本,你需要在运行时请求权限。以下代码演示了如何在活动中请求和检查权限:
javaprivate 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 卡路径。
javaimport 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_STORAGE
,WRITE_EXTERNAL_STORAGE
,运行时权限,File
类,ContextCompat.getExternalFilesDirs
,Storage Access Framework