Android Q 打开指定文件夹

在Android Q中,我们可以使用新的API来打开指定文件夹。这项功能为用户提供了更方便的文件管理体验。本文将详细介绍如何在Android Q中打开指定文件夹,并提供相应的代码示例。

简介

在过去的Android版本中,我们通常需要使用Intent来打开指定的文件夹。但是在Android Q中,由于安全性的考虑,直接使用Intent是不允许的。取而代之的是,Android Q引入了新的API,使我们能够使用更安全的方式打开指定文件夹。

使用 SAF(Storage Access Framework)

在Android Q中,我们可以使用Storage Access Framework(SAF)来打开指定的文件夹。SAF是一个标准的API,用于访问和管理用户的文档和其他文件。它提供了统一的接口,使得我们可以在各种存储设备之间进行无缝操作。

要打开指定文件夹,我们需要执行以下步骤:

  1. 请求用户授权访问指定文件夹
  2. 打开文件夹选择器
  3. 处理选择的文件夹

让我们逐步来完成这些步骤。

请求用户授权

在Android Q中,我们需要请求用户授权才能访问指定的文件夹。要请求授权,我们可以使用ActivityResultLauncher

private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(
    new ActivityResultContracts.RequestPermission(),
    isGranted -> {
        if (isGranted) {
            // 用户已授权
            openFolderPicker();
        } else {
            // 用户拒绝授权
            Toast.makeText(this, "需要授权才能打开文件夹", Toast.LENGTH_SHORT).show();
        }
    }
);

然后,我们可以使用ActivityResultLauncher来请求授权。

private void requestPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        == PackageManager.PERMISSION_GRANTED) {
        // 已授权
        openFolderPicker();
    } else {
        // 未授权,请求权限
        requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
    }
}

当用户授权时,我们将调用openFolderPicker()方法来打开文件夹选择器。

打开文件夹选择器

在Android Q中,我们可以使用ACTION_OPEN_DOCUMENT_TREE来打开文件夹选择器。

private static final int REQUEST_CODE_OPEN_FOLDER = 1;

private void openFolderPicker() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    startActivityForResult(intent, REQUEST_CODE_OPEN_FOLDER);
}

这将打开文件夹选择器,允许用户选择要打开的文件夹。

处理选择的文件夹

当用户选择了文件夹后,系统将返回一个URI给我们。我们可以在onActivityResult()方法中处理选择的文件夹。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_OPEN_FOLDER && resultCode == RESULT_OK && data != null) {
        Uri folderUri = data.getData();
        if (folderUri != null) {
            // 处理选定的文件夹
            // ...
        }
    }
}

我们可以使用返回的URI来操作选定的文件夹,例如,读取文件夹中的文件列表,创建新的文件等等。

示例

下面是一个完整的示例代码,演示了如何在Android Q中打开指定文件夹。

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CODE_OPEN_FOLDER = 1;
    private final ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(
            new ActivityResultContracts.RequestPermission(),
            isGranted -> {
                if (isGranted) {
                    // 用户已授权
                    openFolderPicker();
                } else {
                    // 用户拒绝授权
                    Toast.makeText(this, "需要授权才能打开文件夹", Toast.LENGTH_SHORT).show();
                }
            }
    );

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button openFolderButton = findViewById(R.id.btn_open_folder);
        openFolderButton.setOnClickListener(v -> requestPermission());
    }

    private void requestPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            // 已授权
            openFolderPicker();
        } else {