java - Android Studio - Java:ACTION_OPEN_DOCUMENT 导致 Uri 无效
问题描述
我想打开一个 .csv 文件以将数据导入手机上的本地数据库。我还让用户使用 ACTION_OPEN_DOCUMENT 意图选择 .csv 文件,但是当我查看生成的 Uri 并尝试uri.getPath()
它返回时/document/85
。
我期待更多类似的东西,/downloads/file.csv
但它甚至不包含文件名。
我只在运行 android 11 的手机上对此进行了测试,因此可能是权限问题,但我已经授予WRITE_EXTERNAL_STORAGE
在我检查权限后,它只执行 3 个步骤:
public void Import(){
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/csv");
startActivityForResult(intent, OPEN_BACKUP);
}
然后它处理结果:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == OPEN_BACKUP && resultCode == Activity.RESULT_OK) {
Uri uri = null;
if (data != null) {
uri = data.getData();
ImportCSV(this, uri);
}
}
}
然后它调用这个函数:
private void ImportCSV(Context ctx, Uri uri){
try {
CSVReader csvReader = new CSVReader(new FileReader(uri.getPath()));
} catch (FileNotFoundException e) {
Log.d("Bruh", uri.getPath()); //Always logs '/document/85'
e.printStackTrace();
}
}
我几乎可以肯定问题出在第二步,但我不知道可能是什么问题。任何帮助表示赞赏,谢谢!
(请问您是否需要更多信息)
解决方案
对于 FileReader,您可以使用 Uri 中的 FileDescriptor。https://developer.android.com/training/secure-file-sharing/request-file
FileReader(contentResolver.openFileDescriptor(uri, "r").fileDescriptor)
推荐阅读
- c# - 如何在 C# UWP 中使用 win2d 刻录文本?
- php - 为什么我的 Laravel Auth 没有按预期响应?
- ios - 在 iOS 上使用 FirebaseUI 自动登录
- javascript - 使用 nodejs 路由显示每个用户页面
- mysql - 如何在 Ruby 中执行数据库写入健康检查?
- reactjs - 如果购物车中存在产品,如何更新数量 redcuer react
- python - Discord.py - 使用特定消息回复 DM
- excel - 如何在导入或复制/粘贴后将存储为单元格中文本的数字格式化为数字 | 电子表格 | VBA | 解决方案
- ios - IOS 键盘挡住了 SubView
- kotlin - 如何从另一个类(在 Kotlin 中)退出 runBlocking 协程?