【问题标题】:Does storage access framework work on Xiaomi devices?存储访问框架是否适用于小米设备?
【发布时间】: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


【解决方案1】:

存储访问框架是否适用于 Xaomi 设备?

是的,你发布的所有作品。

只有提供者不授予用户选择的文件的写入权限。

(但也许有一个设置可以提供它??...)

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多