当前位置: 首页 > 知识库问答 >
问题:

storage access framework是否在Xaomi设备上工作?

姜俊民
2023-03-14

我有一个应用程序,可以让用户通过存储访问框架打开文件,编辑它们,然后覆盖之前打开的文件。简而言之,这是基本代码:

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文件管理器作为文档选择器吗?

共有1个答案

酆光熙
2023-03-14

storage access framework是否在Xaomi设备上工作?

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

只有提供者不提供对用户选择的文件的写访问权限。

(但也许有一个设置,会给它??...)

 类似资料:
  • 我正试图在后台获取用户位置。在我的手机(htc one m7)上一切都很好,但出于某种原因,它不能在我测试的两个设备上工作:三星galaxy s3索尼Xperia Z1 顺便说一句:我把所有东西都添加到了清单中。

  • 我有一个网站,必须响应移动电话。我用我的桌面创建了它。当我调整浏览器窗口时,它在手机上工作得很好,但当我在我真正的手机上检查它:三星Galaxy S2时,它对手机视图没有反应。 会有什么问题吗?

  • 问题内容: 我正在使用JDBC做一个Android应用程序,而不使用任何Web服务将数据发送到数据库。我使用Android 2.2模拟器进行了实验,并且能够将数据发送到MySQL DB(LOCALHOST)。之后,我尝试使用Android 2.2设备进行发送,然后更改了with 的路径 。 xx.xx.xx.xx来自我的本地主机。但是它在设备中不起作用。可能是什么原因。 主要疑问: Android

  • 问题内容: 我想知道是否有可能检测浏览器是否在iOS上运行,这与使用Modernizr进行功能检测的方式类似(尽管这显然是设备检测而非功能检测)。 通常,我宁愿使用功能检测,但我需要根据该问题确定设备是否为iOS,因为它们处理视频的方式YouTube API无法在iPad / iPhone/非Flash设备上使用 问题答案: 我不喜欢User Agent嗅探,但是这是你的处理方式: 另一种方法是依

  • 我是android新手,我能够在kotlin中为我的应用程序设置firebase。如果我在Nexus 5X API 27 emulator中运行该应用程序,我就能够获取数据库,但当我在实际设备三星S5(Google play Services V 12.5.29,android V 5.0)中运行该应用程序时,我无法获得addValueEventListener回调。 Gradle文件: 我知道这

  • 问题内容: CSS悬停功能是否可以在移动设备上使用?我有一个css悬停类,在常规的Web浏览器上可以正常工作,但在移动浏览器上却不能工作。 问题答案: 的伪类需要定点(图形输入)设备,能够区分动作的 指向 和 选择/激活。 通常在带有触摸界面的移动设备上,您没有前者,只有后者。另外,某些笔界面仅允许激活,而不能指向。 伪类适用,而用户指定的元件(有一些指示设备),但不将其激活。例如,当光标(鼠标指