首页 > 解决方案 > 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();
    }
}

我几乎可以肯定问题出在第二步,但我不知道可能是什么问题。任何帮助表示赞赏,谢谢!

(请问您是否需要更多信息)

标签: javaandroiduri

解决方案


对于 FileReader,您可以使用 Uri 中的 FileDescriptor。https://developer.android.com/training/secure-file-sharing/request-file

FileReader(contentResolver.openFileDescriptor(uri, "r").fileDescriptor)

推荐阅读