从Android 11开始,我是否需要遵守Android的SAF才能在公共下载位置创建文件? [英] Starting from Android11, do I need to comply to Android's SAF just to even create a file at public Download location?

查看:69
本文介绍了从Android 11开始,我是否需要遵守Android的SAF才能在公共下载位置创建文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Android 11上。我只想在手机上的/storage/emulated/0/Download目录下创建一个文件。因此,这是我需要在其上创建文件的公共下载文件夹。

我不需要访问权限即可读取/修改/删除/storage/emulated/0/Download中的其他文件。我只希望我的应用程序能够在/storage/emulated/0/Download创建和替换自己的文件。就是这样!

问题:

  • 我需要使用Storage Access Framework才能完成此操作吗?
  • 为此需要任何特殊权限吗?
  • 或者是否可以在不经历Android SAF的麻烦的情况下访问/storage/emulated/0/Documents

我的应用可以使用Android 10在/storage/emulated/0/Download创建文件,但从Android 11开始无法创建文件。

我的用例非常简单。我只想在/storage/emulated/0/Download处创建一个文件,并通过不时用新数据替换文件来保持向该文件追加更多数据。

我在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;
 }

推荐答案

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

此操作是否需要任何特殊权限?

否,但您需要WRITE_EXTERNAL_STORAGE用于较旧的设备。

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

Environment.getExternalStoragePublicDirectory()is being undeprecated,所以使用它来访问Environment.DIRECTORY_DOWNLOADS是安全的。这将为您提供相同的access that you have with MediaStore

  • 您可以在那里创建文件

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

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

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

例如,在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,等等。然而,它将数据写入运行Android 11的三星A50上的指定文件。

请注意,如果文件已经存在,这将给出一个异常。因此,例如,我认为这个示例不起作用,直到我意识到我已经从一个月前做的某个实验中获得了test.txtinDownloads/。删除该文件后,示例运行正常。

这篇关于从Android 11开始,我是否需要遵守Android的SAF才能在公共下载位置创建文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆