📌  相关文章
📜  在 Android 11 站点上保存文档:stackoverflow.com - Java (1)

📅  最后修改于: 2023-12-03 15:23:06.254000             🧑  作者: Mango

在 Android 11 站点上保存文档:stackoverflow.com - Java

Android 11 为我们提供了最新的文件访问权限和 API。这些 API 允许我们以更安全和更灵活的方式访问设备文件系统中的文件。本文将向您演示如何在 Android 11 设备上使用 Java 保存文档。

1. 添加清单权限

要访问外部存储器,我们需要在 AndroidManifest.xml 文件中添加相应的权限。请将以下内容添加到文件中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2. 获取文件访问权限

从 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,则将使用旧的权限请求方式。

3. 代码实现

为了在设备上保存文档,我们需要执行以下步骤:

  1. 确定文件保存位置
  2. 使用文件输出流打开文件
  3. 将要保存的内容写入文件
  4. 关闭文件输出流

以下是在 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 和权限模型,您可以使用更安全和更灵活的方式访问设备文件系统。感谢您的阅读!