Android8下载指定路径下文件
时间: 2024-10-17 11:13:26 浏览: 31
在Android 8.0(Oreo)及以上版本中,由于安全性和隐私性的改进,系统默认不再允许应用程序直接通过ContentResolver获取外部存储设备下的文件路径。但是,你可以通过以下步骤间接访问:
1. **使用`ACTION_OPEN_DOCUMENT_TREE`**: 这个动作允许应用请求读取外部存储的根目录,用户可以选择授权一次性的权限。然后,你可以在回调中得到一个`Uri`,可以进一步查询文件。
```java
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_READ_EXTERNAL_STORAGE);
```
在`onActivityResult`中处理结果:
```java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_READ_EXTERNAL_STORAGE && resultCode == Activity.RESULT_OK) {
DocumentFile rootDirectory = data.getParcelableExtra(
DocumentContract.EXTRA/document_tree_uri);
// 使用DocumentFile遍历根目录查找你需要的文件
}
}
```
2. **使用`ACTION_GET_CONTENT`结合`MIMETYPE`**: 如果你知道文件的具体MIME类型,如`.pdf`, `.jpg`等,你可以创建一个新的意图,让用户选择文件。然后从`Intent.getData()`获取选中的文件`Uri`。
```java
Intent pickFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
pickFileIntent.setType("*/*"); // 或者设置特定的MIME类型
startActivityForResult(pickFileIntent, FILE_PICK_REQUEST);
```
在`onActivityResult`中:
```java
String filePath = data.getStringExtra(Intent.EXTRA_STREAM).toString();
```
**注意**:始终需要用户明确授予你的应用访问外部存储的权限,并且在Android 9.0 Pie及以后,如果你的应用不是存储上下文的一部分,还需要在AndroidManifest.xml里添加相应的权限声明。
阅读全文