在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.cfg
、foo.rio
和foo.dat
( - 对于那些要使用的内容,请在
DocumentFile
上调用getUri()
,以获得与ContentResolver
和openInputStream()
一起使用的Uri
来读取内容