【发布时间】:2022-06-25 18:15:09
【问题描述】:
我有一个应用程序可以让用户通过存储访问框架打开文件,编辑它们,然后覆盖之前打开的文件。简而言之,这是基本代码:
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(为不同目的创建)
该应用对我的大多数用户来说都可以正常工作,但其中一个是使用带有 Android 11 的小米 11T Pro。我无法访问的设备 :-(。其他带有 Anroid 11 的设备可以正常工作。该用户可以打开一个文件,但是保存文件时抛出异常(不确定是什么,没有任何日志)。我的真实应用程序也尝试调用takePersistableUriPermission,但这也会在此设备上抛出java.lang.SecurityException。
当我运行应用程序并打开一个文件时,URI 是:
content://com.android.externalstorage.documents/document/…
但是对于这个用户,它的开头却是:
content://com.mi.android.globalFileexplorer.myprovider/external_files/Documents/…
这让我怀疑Mi File Manager 被用作 Xaomi 设备上的文档选择器。
如果我直接在Mi File Manager 中打开一个文件,我看到它只有只读权限。
(某些)小米设备是否会出现这种行为?出于测试目的,是否可以强制我的应用使用 Mi File Manager 作为文档选择器?
【问题讨论】:
-
你应该直接在 onActivityResult 获取持久化 uri 权限。您是否正在检查是否可以同时获得读取和写入权限?那么这两个标志都应该由提供者设置。请报告。
-
您是否测试过其他 Android 11 设备?
-
but an exception is thrown when the file is saved.哪个例外?您没有发布日志。 -
您自己安装了那个应用程序吗?你看到那个供应商了吗?在您安装该应用的 Android 设备上出现问题了吗?
-
can some force my app to use this app as document selector?好吧,如果该应用程序不是文档提供者,那将不会成功。但是,您可以做的是使用该应用程序转到文件,然后让用户使用您的应用程序读取和编辑文件。您可以在自己的 Android 设备上完成所有操作。
标签: android