在API29的时候就会提示API失效如下图:Environment.getExternalStoragePublicDirectory
代替方法也很简单,我们点进去看源码就会看到注释信息给我们的提示的替代方案:
然后我分别打印了下这些对应代码的目录如下图:
总体目录代表的是根目录/Android/data/包名/file
上面目录对应的代码如下:
File externalFilesDir1 = getExternalFilesDir(Environment.DIRECTORY_ALARMS);
File externalFilesDir2 = getExternalFilesDir(Environment.DIRECTORY_AUDIOBOOKS);
File externalFilesDir3 = getExternalFilesDir(Environment.DIRECTORY_DCIM);
File externalFilesDir4 = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS);
File externalFilesDir5 = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
File externalFilesDir6 = getExternalFilesDir(Environment.DIRECTORY_MOVIES);
File externalFilesDir7 = getExternalFilesDir(Environment.DIRECTORY_MUSIC);
File externalFilesDir8 = getExternalFilesDir(Environment.DIRECTORY_NOTIFICATIONS);
File externalFilesDir9 = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File externalFilesDir10 = getExternalFilesDir(Environment.DIRECTORY_PODCASTS);
File externalFilesDir11 = getExternalFilesDir(Environment.DIRECTORY_RINGTONES);
File externalFilesDir12 = getExternalFilesDir(Environment.DIRECTORY_SCREENSHOTS);
File externalFilesDir13 = getExternalFilesDir(Environment.DIRECTORY_RINGTONES);
File externalFilesDir14 = getExternalFilesDir(Environment.MEDIA_BAD_REMOVAL);
File externalFilesDir15 = getExternalFilesDir(Environment.MEDIA_CHECKING);
File externalFilesDir16 = getExternalFilesDir(Environment.MEDIA_EJECTING);
File externalFilesDir17 = getExternalFilesDir(Environment.MEDIA_MOUNTED);
File externalFilesDir18 = getExternalFilesDir(Environment.MEDIA_MOUNTED_READ_ONLY);
File externalFilesDir19 = getExternalFilesDir(Environment.MEDIA_NOFS);
File externalFilesDir20 = getExternalFilesDir(Environment.MEDIA_REMOVED);
File externalFilesDir21 = getExternalFilesDir(Environment.MEDIA_SHARED);
File externalFilesDir22 = getExternalFilesDir(Environment.MEDIA_UNKNOWN);
File externalFilesDir23 = getExternalFilesDir(Environment.MEDIA_UNMOUNTABLE);
File externalFilesDir24 = getExternalFilesDir(Environment.MEDIA_UNMOUNTED);
Log.e("打印路径", externalFilesDir1.getAbsolutePath()
+ "\n" + externalFilesDir1.getAbsolutePath()
+ "\n" + externalFilesDir1.getAbsolutePath()
+ "\n" + externalFilesDir2.getAbsolutePath()
+ "\n" + externalFilesDir3.getAbsolutePath()
+ "\n" + externalFilesDir4.getAbsolutePath()
+ "\n" + externalFilesDir5.getAbsolutePath()
+ "\n" + externalFilesDir6.getAbsolutePath()
+ "\n" + externalFilesDir7.getAbsolutePath()
+ "\n" + externalFilesDir8.getAbsolutePath()
+ "\n" + externalFilesDir9.getAbsolutePath()
+ "\n" + externalFilesDir10.getAbsolutePath()
+ "\n" + externalFilesDir11.getAbsolutePath()
+ "\n" + externalFilesDir12.getAbsolutePath()
+ "\n" + externalFilesDir13.getAbsolutePath()
+ "\n" + externalFilesDir14.getAbsolutePath()
+ "\n" + externalFilesDir15.getAbsolutePath()
+ "\n" + externalFilesDir16.getAbsolutePath()
+ "\n" + externalFilesDir17.getAbsolutePath()
+ "\n" + externalFilesDir18.getAbsolutePath()
+ "\n" + externalFilesDir19.getAbsolutePath()
+ "\n" + externalFilesDir20.getAbsolutePath()
+ "\n" + externalFilesDir21.getAbsolutePath()
+ "\n" + externalFilesDir22.getAbsolutePath()
+ "\n" + externalFilesDir23.getAbsolutePath()
+ "\n" + externalFilesDir24.getAbsolutePath());
在API29的时候就会提示API失效如下图:Environment.getExternalStoragePublicDirectory代替方法也很简单,我们点进去看源码就会看到注释信息给我们的提示的替代方案:然后我分别打印了下这些对应代码的目录如下图:总体目录代表的是根目录/Android/data/包名/file上面目录对应的代码如下:File externalFilesDir1 = getExternalFilesDir(Environment.DIRECTORY_AL
Android
解决get
External
Storage
Directory
在
29
后
废弃
问题
,亲测能用
初衷:在安卓10之后相信大家都遇到了get
External
Storage
Directory
废弃
的
问题
,看了网上很多都根据官方用到了get
External
FilesDir但是保存图片至相册后的通知又成了一个
问题
,所以我们还是不要走歪路,直接替代get
External
Storage
Directory
废话不多说,直接上代码:
// SDCard地址 /
storage
/emulated/0
File root = new File(
Environment
.get
External
Storage
Directory
()
.getAbsolutePath()+File.separator+"lzy");
if (!root.exists()){
用
Android
X版本SDK时,使用到以下相关方法:
Environment
.get
External
Storage
Directory
(),
Environment
.get
External
Storage
Public
Directory
()时,AS会提示该方法已
废弃
,但是提供了Context的get
External
FilesDir(String)方法(其中一方面是为了安全性 考虑,感兴趣的可以查看一下文档),其他的还有MediaStore已经Intent的ACTION_OPEN_DOCUMENT方法
getEx
Environment
.get
External
Storage
Directory
()与
Environment
.get
External
Storage
Public
Directory
(String type)
Environment
.get
External
Storage
Directory
()是获得外部存储的第一层的对象,可以通过这个对象获得这一层的各个文件的名称,路径,以及建立其中一个文件的抽象对象。
代码如下: File files =
Environment
.get
External
Storage
Directory
();//获得外部存储器的第一层的文件对象
File fil
最近在
开发
时,需要下载一个文件,但是
Android
上的get
external
storage
public
directory
显示已过期(deprecated)。于是谷歌了一下,搜到了这篇文章从共享存储空间访问文档和其他文件。
原来,现在的
Android
系统,将文件系统划分为下面几项:
应用专属存储空间
具体可以查看数据和文件存储概览,文章里有非常详细的介绍。这里主要看应用共享存储空间与共享存储。其中应用专属存储空间无需申请权限,在应用卸载的时候会移除文件。如果文件存储在外部存储空
内部存储是指系统内部存储空间,**在逻辑上用
目录
来区分的话就是data
目录
下的文件夹**
除此之外data
目录
下有app
目录
存放系统下载的apk信息,有data
目录
存放各种文件
sharedPreferenced存储的文件在 /data/data/<packagename>/shared_prefs/
目录
下。
Sqlite存储的文件在 /data/data/<packagename>/database/
目录
下。
从
Android
1.0开始,写操作受权限WRITE_
EXTERNAL
_
STORAGE
保护。
从
Android
4.1开始,读操作受权限READ_
EXTERNAL
_
STORAGE
保护。
从
Android
4.4开始,应用可以管理在它外部存储上的特定包名
目录
,而不用
获取
WRITE_
EXTERNAL
_
STORAGE
权限。
比如,一个包名为com.example.foo的应用,可以自...
本文参考地址:http://www.cnblogs.com/mengdd/p/3742623.html
上周老板的手机进行了一次插拔sd卡,app发图片到车友圈就罢工了,我调试了一下代码,我发现是路径的
问题
。
原来app路径是这样写的:
Environment
.get
External
Storage
Directory
()+"/coolcar/CoolcarImg"
我觉得没有
问题
啊,于是我改了一
我在C-Sharp中尝试
获取
安卓手机Download
目录
时,尽管已经授予了权限,但是依旧报错:permission denied。这是我的代码: private async void GetButton_Clicked(object sender, EventArgs e) { PermissionStatus status = await Permissions.RequestAsync<Permissions.
Storage
Write>(); if (status != PermissionStatus.Granted) { Result.Text = "Permissiont DENIED!"; return; } List<string> filePaths = new(); #if WINDOWS filePaths = await GetFileNames(); #elif
ANDROID
string downloadPath =
Android
.OS.
Environment
.Get
External
Storage
Public
Directory
(
Android
.OS.
Environment
.
Directory
Downloads).AbsolutePath; filePaths = await GetFileNames(downloadPath); #endif Result.Text = string.Join(", ", filePaths); } static readonly string[] ends = { ".wav", ".wma", ".mp3", ".flac", ".aac", ".m4a" };
public
static async Task<string> FilePicker() { PickOptions pickOptions = new() { PickerTitle = "选一个文件" }; FileResult result = await Microsoft.Maui.
Storage
.FilePicker.Default.PickAsync(pickOptions); return result.FullPath; }
public
static async Task<List<string>> GetFileNames(string rootPath = null) { if (rootPath == null) { rootPath = await FilePicker(); rootPath =
Directory
.GetParent(rootPath).FullName; if (string.IsNullOrEmpty(rootPath)) return null; } List<string> filePaths = GetFiles(rootPath); return filePaths; } private static List<string> GetFiles(string path) { List<string> filePaths = new(); try { foreach (string file in
Directory
.GetFiles(path)) { bool flag = false; foreach (string end in ends) { if (file.EndsWith(end)) { flag = true; } } if (!flag) { continue; } filePaths.Add(file); } string[] directories =
Directory
.GetDirectories(path); if (directories.Length >= 0) { foreach (string
directory
in directories) { filePaths.AddRange(GetFiles(
directory
)); } } } catch (Exception ex) { List<string> errors = new() { ex.Message }; return errors; } return filePaths; }
在 C# 中
获取
Android
手机的 Download
目录
并不是很容易,因为它需要通过 Xamarin 或其他方法来访问
Android
系统
API
。
为了解决权限
问题
,你需要在
Android
Manifest.xml 文件中声明你应用需要访问存储的权限:
<uses-permission
android
:name="
android
.permission.WRITE_
EXTERNAL
_
STORAGE
" />
如果你在代码中已经请求了这个权限,你应该检查下你的请求代码是否正确,并且要确保在调用前已经获得了权限。
关于
获取
Android
手机的 Download
目录
,你可以使用以下代码:
string downloadPath =
Android
.OS.
Environment
.Get
External
Storage
Public
Directory
(
Android
.OS.
Environment
.
Directory
Downloads).AbsolutePath;
但是,你需要注意,在
Android
10 中,Google 已经更改了存储访问权限模型。现在,应用只能访问其自己的存储区域,不能直接访问其他应用的存储区域。
如果你想要访问其他应用的存储区域,你需要使用
Android
系统的文件选择器来请求用户授权。你可以使用 Xamarin.Essentials 库中的 FilePicker 类来实现这个功能。
FilePicker.PickAsync(new string[] { "image/*" }, new Platform.OnPickFileResultEventArgs
File = async (file) =>
// Use file
xiayiye5: