我有一个应用程序,可以让用户通过存储访问框架打开文件,编辑它们,然后覆盖之前打开的文件。简而言之,这是基本代码:
private ActivityResultLauncher<String[]> mGetContent;
private Uri OpenFileUri;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mGetContent = registerForActivityResult(new ActivityResultContracts.OpenDocument(),
new ActivityResultCallback<Uri>() {
@Override
public void onActivityResult(Uri uri) {
try (InputStream in = getActivity().getContentResolver().openInputStream(uri))
{
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String text = reader.lines().collect(Collectors.joining("\n"));
binding.editBox.setText(text);
OpenFileUri = uri;
} catch (IOException e) {
e.printStackTrace();
}
}
});
binding.buttonOpen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mGetContent.launch(new String[] {"text/*"});
}
});
binding.buttonSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (OpenFileUri == null)
return;
try (OutputStream mOutputStream = getActivity().getContentResolver().openOutputStream(OpenFileUri, "wt")) {
try (PrintWriter p = new PrintWriter(mOutputStream)) {
String t = binding.editBox.getText().toString();
p.println(t);
} catch (Exception e1) {
e1.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
此处提供完整代码:https://github.com/pekspro/CorruptFileDemo(为不同目的创建)
该应用程序对我的大多数用户来说都运行良好,但有一个用户正在使用Xaomi 11T Pro和Android 11。我无权访问的设备:-(。其他使用Anroid 11的设备运行良好。此用户可以打开文件,但在保存文件时会引发异常(不确定是什么,没有任何日志)。我的真实应用程序也试图调用tePeristableUriPersion,但这也在此设备上引发了一个java.lang.SecurityException
。
当我运行应用程序并打开文件时,URI为:
content://com.android.externalstorage.documents/document/…
但对于该用户,它的开头是:
content://com.mi.android.globalFileexplorer.myprovider/external_files/Documents/…
这让我怀疑Mi File Manager在Xaomi设备上用作文档选择器。
如果我直接在小米文件管理器中打开一个文件,我看到它只有只读权限。
(某些)Xaomi设备是否会出现此行为?出于测试目的,可以强制我的应用程序使用Mi文件管理器作为文档选择器吗?
storage access framework是否在Xaomi设备上工作?
是的,你发布的所有作品。
只有提供者不提供对用户选择的文件的写访问权限。
(但也许有一个设置,会给它??...)