Starting from Android11, do I need to comply to Android#39;s SAF just to even create a file at public Download location?(从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.txt
inDownloads/
。删除该文件后,示例运行正常。
这篇关于从Android 11开始,我是否需要遵守Android的SAF才能在公共下载位置创建文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从Android 11开始,我是否需要遵守Android的SAF才能在公共下载位置创建文件?


- 用 Swift 实现 UITextFieldDelegate 2022-01-01
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01
- Android - 拆分 Drawable 2022-01-01
- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01
- 想使用ViewPager,无法识别android.support.*? 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- Android viewpager检测滑动超出范围 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
- android 4中的android RadioButton问题 2022-01-01