如果该文件不存在,我想在外部存储中创建一个新文件。我已经在 SO 中阅读了类似的问题,并WRITE_EXTERNAL_STORAGE在我的清单中获得了许可。在使用 android 5.1 和 xperia t 使用 android 4.3 的 GenyMotion 模拟器上测试结果是一样的,我得到“打开失败:EACCES(权限被拒绝) ” file.createNewFile()。我检查了运行时,getExternalStorageStatefunctoin 返回值是 "MOUNTED "。
注意:如果我手动创建文件,我的代码可以完美运行并读取内容,这意味着可以访问外部存储。我虽然在我的代码中的另一个地方写入外部存储getExternalPublicStorage用于保存捕获的图像,但它工作正常!
File f = Environment.getExternalStorageDirectory();
File config = new File(f, "poinila config" + ".txt");
if (!config.exists()) {
if (!config.createNewFile()) {
// toast that creating directory failed
} else {
writeDefaultIpPort();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑: 路径字符串是“/storage/sdcard0/poinila config.txt”
目前我正在尝试从SD卡或任何应用程序中选择特定类型的文件,但我失败了,我的代码如下,
Intent intent;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT)
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
else
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/pdf|application/msword|application/vnd.openxmlformats-officedocument.wordprocessingml.document" +
"|application/vnd.openxmlformats-officedocument.wordprocessingml.template" +
"|application/vnd.ms-word.document.macroEnabled.12" +
"|application/vnd.ms-word.template.macroEnabled.12" +
"!application/vnd.ms-word.template.macroEnabled.12|application/rtf");
startActivityForResult(intent, Constants.ImagePicker.REQ_PICK_RESUME);
Run Code Online (Sandbox Code Playgroud)
但它只选择每种类型的文件.
android document android-intent android-gallery android-external-storage
我用了
File f=new File(MyPath);
f.delete();
Run Code Online (Sandbox Code Playgroud)
我使用了权限WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE,但它在 Android 5 中不起作用。
Logcat 消息:
java.io.FileNotFoundException: storage/external_SD/mm.txt: open failed: EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mahestan_programming.myapplication">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
自版本 4.4 起,我们无法从 MICRO SD 卡删除和写入文件。现在它是只读的。
android delete-file android-permissions android-external-storage
我正在为我的 Android 应用实现导入功能。我想让用户选择他们想要从他们设备上的外部存储(确切地说是下载目录)和其他在线文件存储(如 DropBox 和 Google Drive)导入的文件。
我实现了它并在一个模拟器和两个安卓设备上进行了测试。当我在模拟器上测试它时,Android 版本 6.0,因为它没有安装 DropBox 和 GoogleDrive,我看到了我所期待的,它能够从下载目录中选择一个文件:

当我在 Google Pixel 手机 Android 版本 7.1.2 上对其进行测试时,一切都按我的预期工作。我可以从下载目录、Google Drive 和 DropBox 中选择一个文件:

但是,当我在三星 Galaxy 4 设备 Android 版本 5.0.1 上对其进行测试时,我可以从 Google Drive 和 Dropbox 中选择一个文件,但是我无法从我的下载目录中选择一个文件:

这是我选择文件的代码:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/*");
startActivityForResult(intent, GET_FILE_RESULT_CODE);
Run Code Online (Sandbox Code Playgroud)
请让我知道我可以做些什么来解决这个问题。谢谢!
android android-intent android-file android-external-storage android-storage
我试图让我的应用程序能够移动到 SD 卡。到目前为止,我已将属性 android:installLocation="auto" 添加到我的清单文件中。
当我尝试将手机上的应用程序 (75MB) 的存储选项从内部移动到外部时,该选项可以移动它,但它在完成 90% 后一直显示“没有足够的存储空间”,即使我的内部 (64 GB) 和外部 (128 GB) 有足够的空间。我还尝试在我的手机上移动一个大于 (75MB) 的不同应用程序,并且传输成功。我还尝试创建一个虚拟模拟器来尝试传输我的应用程序,但它正在做同样的事情。
清单文件中是否有我缺少的属性导致此问题发生?有什么建议?
android android-manifest android-sdcard android-external-storage
我正在尝试获取 Android 设备的内部和外部存储路径。
这就是我在大多数设备中获取内部存储路径的方式
Environment.getExternalStorageDirectory().getPath()
Run Code Online (Sandbox Code Playgroud)
上述方法适用于大多数设备,但某些设备此方法会出现问题,即它返回 SD 卡路径。
有人可以告诉我如何准确获取那些Environment.getExternalStorageDirectory().getPath()返回外部存储路径(SD 卡路径)的设备中的内部存储路径。
我也知道,Environment.getDataDirectory().getPath()但此方法返回值类似于/data同一 Environment.getExternalStorageDirectory().getPath()设备返回/storage/sdcard0的值,当 SD 卡不存在时,该值指向内部存储,但当 SD 卡存在时,它会给出指向 SD 卡而不是内部存储的路径。
谁能帮助我理解上述两者之间的区别,并帮助我获取Android设备的内部存储路径?另外,请帮助我找到一个适用于所有设备的解决方案。
编辑:任何认为这篇文章不合适的人请发表评论并让我知道原因,以便我将来牢记这一点。
java storage android android-sdcard android-external-storage
请在拒绝投票和/或将其标记为重复之前阅读整篇文章!
我正在开发一个应用程序,它从用户手机上的特定文件夹中读取文件 - 从 SD 卡(如果有的话)或从内置存储。是的,清单中提到了“READ_EXTERNAL_STORAGE”,我也在处理 API>23 的权限弹出窗口。
我曾经简单地使用
File folder = new File(Environment.getExternalStorageDirectory(), "myfolder");
Run Code Online (Sandbox Code Playgroud)
获取存储在内置存储(S7 为 32gb)中的文件夹的路径,但现在我想获取 SD 卡的路径。根据谷歌给我的几乎每一个结果,“Environment.getExternalStorageDirectory()”应该给你SD卡的路径,但对我来说它没有(而且从来没有)。
我已经用两个不同的三星 Galaxy S7 测试了以下内容,两者都使用 Android 7.0,一个带有 SD 卡(+ 文件夹),另一个没有(+ 文件夹):
Log.d(tag, System.getenv("EXTERNAL_STORAGE"));
Log.d(tag, System.getenv("SECONDARY_STORAGE"));
Log.d(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+"myfolder").isDirectory());
Log.e(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+ordner).getAbsolutePath());
Log.d(tag, Environment.isExternalStorageRemovable());
Log.d(tag, Environment.getExternalStorageDirectory());
Log.d(tag, Environment.getExternalStorageDirectory().getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,两部手机都输出相同的信息:
/sdcard
null
true
/sdcard/myfolder
false
/storage/emulated/0
/storage/emulated/0
Run Code Online (Sandbox Code Playgroud)
根据文件管理器应用程序(“我的文件”),内置存储称为“内部存储”,这更没有意义(我知道Android中内部存储和外部存储之间的区别)。
如何获取实际 SD 卡的路径(无需对其进行硬编码)?
android sd-card android-sdcard android-external-storage android-7.0-nougat
在Android Pie之前,我始终存储应用程序需要存储在上的文件,这些文件/sdcard/my-app/是通过
File fBaseDir = new File(Environment.getExternalStorageDirectory(), "my-app");
我的一个应用程序在其中存储了数百个(最多数千个)收藏夹图标/sdcard/my-app/favicons,当用户创建该应用程序的备份时,它将存储在中/sdcard/my-app/backups。与我的应用共享时,Chrome浏览器拍摄的网页屏幕快照存储在中/sdcard/my-app/screenshots,依此类推。
当我卸载该应用程序时,我可以稍后重新安装它,并且仍然具有所有图标,屏幕快照和备份可用于恢复状态,而不必重新下载所有图标(并且可能丢失了所有其他数据)。
我还可以/sdcard/my-app/通过将目录复制到PC上轻松创建该目录的备份,并在另一部手机上将其还原,例如,当我迁移到新设备时。
我还可以使用文件浏览器查看该目录中的文件,然后选择并通过电子邮件发送或将其复制到Google云端硬盘,或专门删除其中的一些文件(例如旧的备份文件)。
在Android 10中,这种方法已经崩溃。我无法将图标添加到Images Media-Folder,因为它们不是真实图像,它们会不必要地使视图混乱,并可能禁止我的开发者帐户进入Play商店。我也不想将所有这些数据存储在App-Private目录中,因为在卸载该应用程序时,这些数据将被删除,并且因为其他应用程序(例如资源管理器)无法访问它们。
我有什么选择?手动选择文件或目录不是一种选择,除非目录只需要选择一次,然后永久授予访问权限(以读取和写入文件)。
我从不在外面读书或写东西/sdcard/my-app/。
我需要打开并保存设备上可能存在的简单文本文件。例如在文档、下载等中。只要文件可用于其他程序,在 Android 术语中,它就是“外部存储”
\npath_provider提供了几种方法。其中之一getExternalStorageDirectory()。安卓文档说:
\n\n此方法已在 API 级别 29 中弃用。为了提高用户隐私,\n不推荐直接访问共享/外部存储设备。当\n应用程序定位 Build.VERSION_CODES.Q链接时
\n
如果我使用方法path_provider
getExternalStorageDirectory()\xe2\x86\x92 /storage/emulated/0/Android/data/myapp.name/files \n getApplicationDocumentsDirectory()\xe2\x86\x92 /data/user/0/myapp.name/app_flutter
getExternalStorageDirectories(type: StorageDirectory.documents)返回列表,其中包含
/storage/emulated/0/Android/data/myapp.name/files/Documents
\n/storage/1CEE-4019/Android/data/myapp.name/files/Documents
\n在我的 Android 模拟器(Api 30)上,真实的外部文档位于
\n/存储/模拟/0/文档
\n/存储/模拟/0/下载
\n我怎样才能访问它们?据我了解,没有其他选择path_provider
文件不仅仅是媒体文件。它也可能是.pdf、.zip、.xls 等。
API 33 上的外部存储权限被永久拒绝。
因此,我们无法像这样的方法进行保存 ->
String path = 'This is external storage path';
File(path).writeAsBytes(bytes)
Run Code Online (Sandbox Code Playgroud)
我的应用程序在 android 11、10、9 等上运行良好。我已经在 AndroidManifest.xml 上设置了存储权限,但它在 android 13 上不起作用。
那么,如何在 android 13 上的外部存储中保存文件?
我知道一种在 AndroidManifest.xml 上设置MANAGE_EXTERNAL_STORAGE 的方法。但它受到 PlayStore 的限制。所以,这对我们来说不太好。
那么,在 Android 13 的外部存储上保存文件的最佳方式是什么?
我看过这个讨论。
storage dart android-permissions android-external-storage flutter
android ×8
flutter ×2
storage ×2
android-10.0 ×1
android-file ×1
dart ×1
delete-file ×1
document ×1
file-access ×1
java ×1
sd-card ×1