0

在 Android Studio 中:

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

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

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

            }           

         }
    
      }

   }

}            

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

4

1 回答 1

1

请帮助我,我该怎么做?

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

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

  • 用于DocumentFile.fromTreeUri()获取DocumentFile表示树的
  • 调用listFiles()DocumentFile以获取该树的直接内容,以DocumentFile对象列表的形式
  • 调用getName()其中的每一个以获取它们的显示名称,然后查看哪些名称具有您想要的文件扩展名和匹配的基本名称(foo.cfgfoo.riofoo.dat
  • 对于您想要使用的那些,请调用getUri()DocumentFile获取Uri使用ContentResolveropenInputStream()阅读内容
于 2022-01-14T23:12:48.453 回答