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

从Android11开始,我是否需要遵守Android的SAF,甚至在公共下载位置创建一个文件?

司马飞
2023-03-14

我在Android 11。我只是想能够创建一个文件在/存储/模拟/0/下载目录在我的手机上。所以,这是我需要创建文件的公共下载文件夹。

我不需要访问读取/修改/删除/存储/仿真/0/下载中的其他文件。就是它!

问题:

  • 为此,我需要通过存储访问框架吗?
  • 我需要特别许可吗?
  • 或者它是可能的访问/存储/仿真/0/文档没有经过Android SAF的麻烦?

我的应用程序是能够创建一个文件在/存储/模拟/0/下载使用Android 10但它未能做到这一点,因为Android 11.

我的用例非常简单。我只是想创建一个文件在/存储/仿真/0/下载和不断追加更多的数据到文件替换为一个新的不时。

在Android 11上运行以下代码失败:

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File file = new File(path, "Somefile.txt");
String location = file.getAbsolutePath();

try {
     file.createNewFile();
     byte[] data1 = {1,1,0,0};
     OutputStream fo = new FileOutputStream(file);
     fo.write(data1);
     fo.close();
     Log.i(TAG, "The file is created at " + location);
 } catch (IOException e) {
     Log.e(TAG, "Exception creating file");
     return location;
 }

共有1个答案

朱通
2023-03-14

为此,我需要使用存储访问框架吗?

我需要特别许可吗?

不,虽然您需要WRITE_EXTERNAL_STORAGE用于旧设备。

或者,是否有可能在不经历Android SAF麻烦的情况下访问/storage/simulated/0/文档?

Environment.getExtranalStoragePublicDirectory()未被弃用,因此使用它访问环境是安全的。DIRECTORY_DOWNLOADS。这将为您提供与使用MediaStore相同的访问权限:

>

  • 可以在那里创建文件

    你可以在那里读写你自己的文件1

    您无法访问其他应用程序的文件

    1在本项目中,“您自己的”是指您当前的应用程序安装-如果用户卸载并重新安装您的应用程序,则旧安装的应用程序中的文件不再被视为“您自己的”。

    例如,在targetSdkVersion 31项目中,如果没有任何权限,此活动就可以正常工作:

    package com.commonsware.downloadtest;
    
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Log;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    
    public class MainActivity extends AppCompatActivity {
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        writeToDownloads();
      }
    
      private void writeToDownloads() {
        try {
          File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
          File target = new File(dir, "test.txt");
          PrintWriter out = new PrintWriter(new FileWriter(target));
    
          out.println("hello, world!");
          out.flush();
          out.close();
        } catch (Exception e) {
          Log.e("DownloadTest", "Exception writing to Downloads/", e);
        }
      }
    }
    

    现在,这段代码糟透了,因为它不处理旧的设备,在主应用程序线程上执行I/O,等等。然而,它将数据写入指定的文件,在运行Android11的三星A50上。

    请注意,如果该文件已经存在,则会出现异常。例如,我认为这个例子不起作用,直到我意识到我一个月前做的一些实验中已经有了test.txtDownloads/中。一旦我删除了那个文件,这个示例就运行得很好。

  •  类似资料:
    • 我现在能够在运行在Websphere服务器上的Java EE项目中自动进行增量编译。 我整理jRebel是因为我在突然启动服务器时遇到了问题,并且注意到现在Intellij正在自动编译,我也能够“几乎”有效地看到更改(比Eclipse慢) 那么,intellij中甚至需要jRebel吗?我对Websphere的设置可以在下图中看到。注意,我只添加了一个Ear文件,它不是分解版本,仍然这是工作。jr

    • 问题内容: 我在进行CSS设计时一直想知道的东西。 是否遵守CSS宽度的小数位数?还是四舍五入? 要么 问题答案: 如果是百分比宽度,那么可以,它是受尊重的。正如Martin所指出的,当您达到小数像素时,事情就会崩溃,但是如果百分比值产生整数像素值(例如,示例中200px的50.5%),您将获得明智的预期行为。 编辑: 我已经更新了示例,以显示小数像素发生了什么(在Chrome中,值被截断了,因此

    • 我当前的环境已经有了一个google-services.json文件,并且一切正常。但是现在由于不可预见的情况,我必须重命名我的项目包。我现在已经成功地重命名了包。我还进入了google-services.json文件,并在其中重命名了包名。所以现在我想知道我是否需要回到谷歌开发者网站并创建一个新的配置文件?

    • 问题内容: 所以,我不确定那是什么。如果在 ModuleA中 ,我有: 在 ModuleB中 ,我有: 在主程序中,我有: 因此,当我运行主程序时,我想我将创建两个猫鼬“实例”;一个连接到pathA,一个连接到pathB,对吗? 另外,在模块B中,在我连接到pathB之前,它是连接到pathA还是什么都没有? 谢谢。 问题答案: 我刚刚对最新的节点V0.4.6做了一些测试。我确认了以下内容: 从“

    • 问题内容: 因此,我们有一个页面: 并想添加一些点击事件: 奇迹般有效!但是,当您将第二个参数设为外部函数时: 它立即调用该函数。我该如何阻止! 问题答案: 由于第二个参数需要函数 引用 ,因此您需要提供一个。使用有问题的代码,您将立即调用该函数并传递其 结果(这是因为,因为该函数所做的全部是且不返回任何内容)。在匿名函数中调用该函数(如您的第一个示例),或者更改该函数以返回一个函数。

    • 我在使用Java和FXML文件时遇到了一个问题。 现在我找了好几个小时,找不到任何解决我问题的东西,所以我最后的希望是针对我的具体情况提出问题(我知道像这个问题和其他问题,但没有一个真正帮助我在这方面。 简单说明:我有一个Eclipse Java项目,我的类(对于这个问题很重要)在包[Project Name]/src/measurements.gui中。我的FXML文件在[Project Nam