我使用存储访问框架浏览文件 link f.cfg,当你 select 文件时,应用程序需要自动加载另一个文件 f.dat ,如何?

I Use Storage Access Framework to browse a file link f.cfg, when you select the file, the app need to load another file like f.dat automatically, how?

在 Android 工作室中:

此应用程序必须使用 COMTRADE 文件。 COMTRADE 文件是 *.cfg *.dat 和 *.rio 文件。例如,(user.cfg、user.dat 和 user.rio)。主文件是*.cfg文件,所以用户必须通过SAF浏览才能找到*.cfg文件,当用户select这个文件时,应用程序必须自动加载其他文件(*.dat和*.rio) .

我无法使用 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> android 级别 30

所以我必须使用存储访问框架,通过下面的代码用户浏览 *.cfg 文件和 select 像 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 return 那个 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();
               }

            }           

         }
    
      }

   }

}            

请帮帮我,我该怎么做?谢谢。

Please help me how can I do this?

您不能这样做,至少通过使用 ACTION_OPEN_DOCUMENT,除非您要求用户依次打开您的三个文档中的每一个。仅仅因为用户选择了一个 .cfg 文件并不意味着您对任何其他文件(包括与其相邻的文件)拥有任何权利。

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

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