我使用存储访问框架浏览一个文件链接f.cfg,当你选择该文件时,应用程序需要自动加载另一个像f.dat这样的文件,如何



在Android Studio中:

此应用程序必须使用COMTRADE文件。COMTRADE文件是*.cfg*.dat和*.rio文件。例如,(user.cfg、user.dat和user.reo(。主文件是*.cfg文件,因此用户必须通过SAF浏览才能找到*.cfg的文件,当用户选择该文件时,应用程序必须自动加载其他文件(*.dat和*.rio(。

我不能将<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>用于android级别30的

所以我必须使用存储访问框架,通过下面的代码,用户浏览*.cfg文件并选择一个类似user.cfg 的文件

if(SDK_INT >= Build.VERSION_CODES.R)
{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Act.startActivityForResult(intent, 111);
}
else
{...}

然后SAF返回该user.cfg文件的URI,并且应用程序没有任何其他文件的URI要加载。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 111)
{

if (resultCode == Activity.RESULT_OK) 
{

if (data != null)
{

try 
{

Uri uri = null;
uri = data.getData();

InputStreamReader inputStreamReader = new InputStreamReader(getContentResolver().openInputStream(uri));

BufferedReader br = new BufferedReader(inputStreamReader);
// I want URI of user.dat how?

InputStreamReader inputStreamReader1 = new InputStreamReader(getContentResolver().openInputStream(uri1));

BufferedReader br1 = new BufferedReader(inputStreamReader1);

....

}  
catch (Exception e)
{
e.printStackTrace();
}
}           
}

}
}
}            

请帮我怎么做?谢谢

请帮我怎么做?

除非您要求用户依次打开您的三个文档中的每一个,否则您无法做到这一点,至少可以使用ACTION_OPEN_DOCUMENT。仅仅因为用户选择了.cfg文件并不意味着你对任何其他文件都有任何权限,包括与之相邻的文件

您可以尝试使用ACTION_OPEN_DOCUMENT_TREE,让用户选择包含所需文件的文档树。从那里,你可以:

  • 使用DocumentFile.fromTreeUri()获取表示树的DocumentFile
  • 调用该DocumentFile上的listFiles(),以DocumentFile对象列表的形式获取该树的直接内容
  • 对每个名称调用getName()以获取它们的显示名称,然后查看哪些名称具有所需的文件扩展名和匹配的基本名称(foo.cfgfoo.riofoo.dat(
  • 对于那些要使用的内容,请在DocumentFile上调用getUri(),以获得与ContentResolveropenInputStream()一起使用的Uri来读取内容

相关内容

最新更新