📅  最后修改于: 2023-12-03 15:23:06.254000             🧑  作者: Mango
Android 11 为我们提供了最新的文件访问权限和 API。这些 API 允许我们以更安全和更灵活的方式访问设备文件系统中的文件。本文将向您演示如何在 Android 11 设备上使用 Java 保存文档。
要访问外部存储器,我们需要在 AndroidManifest.xml 文件中添加相应的权限。请将以下内容添加到文件中:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
从 Android 6.0 开始,我们不再默认具有对外部存储器的写入访问权限。因此,我们必须在运行时请求这些权限。请使用以下代码获取访问权限:
private void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
try {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
startActivityForResult(intent, 2296);
} catch (Exception ignored) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivityForResult(intent, 2296);
}
} else {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
此代码将请求在 Android 11 中获取文件的访问权限。如果设备版本低于 Android 11,则将使用旧的权限请求方式。
为了在设备上保存文档,我们需要执行以下步骤:
以下是在 Android 11 上保存文档的代码实现示例:
private void saveDocument(String fileName, String content) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Downloads.DISPLAY_NAME, fileName);
contentValues.put(MediaStore.Downloads.MIME_TYPE, "text/plain");
contentValues.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS + "/MyApp");
Uri uri = getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues);
try {
OutputStream outputStream = getContentResolver().openOutputStream(uri);
if (outputStream != null) {
outputStream.write(content.getBytes());
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} else {
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + File.separator + "MyApp" + File.separator + fileName);
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(content.getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
该代码根据设备版本使用不同的实现方式。如果设备版本低于 Android 11,则使用旧的文件系统 API。否则,我们使用新的 MediaStore API 将文件保存到设备上。
现在,您已经知道如何在 Android 11 设备上使用 Java 保存文档。通过了解适用于 Android 11 的最新 API 和权限模型,您可以使用更安全和更灵活的方式访问设备文件系统。感谢您的阅读!