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,用于访问和管理用户的文档和其他文件。它提供了统一的接口,使得我们可以在各种存储设备之间进行无缝操作。
要打开指定文件夹,我们需要执行以下步骤:
- 请求用户授权访问指定文件夹
- 打开文件夹选择器
- 处理选择的文件夹
让我们逐步来完成这些步骤。
请求用户授权
在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 {