我使用存储访问框架浏览文件 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.cfg
和 foo.rio
和 foo.dat
)
- 对于那些您想使用的,请在
DocumentFile
上调用 getUri()
以获得 Uri
以与 ContentResolver
和 openInputStream()
一起使用以阅读在内容
在 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.cfg
和foo.rio
和foo.dat
) - 对于那些您想使用的,请在
DocumentFile
上调用getUri()
以获得Uri
以与ContentResolver
和openInputStream()
一起使用以阅读在内容