标签: android-external-storage

为什么在 Android Q 及更高版本上不需要 WRITE_EXTERNAL_STORAGE

我使用 DownloadManager 下载照片并将其保存到外部图片目录:

.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, File.separator + filename)
Run Code Online (Sandbox Code Playgroud)

Marshmallow 需要 WRITE_EXTERNAL_STORAGE(如预期),但在 Android Q 及更高版本上,它无需许可即可正常工作。为什么会这样?是因为范围存储吗?

android android-permissions android-download-manager android-external-storage scoped-storage

7
推荐指数
1
解决办法
2111
查看次数

在Android中将文件从内部存储复制到外部存储

我的应用程序(Android API 15)制作图片并将其存储在内部存储器的文件夹中.现在,我想将此文件复制到外部存储器内的另一个文件夹,例如/sdcard/myapp.我尝试了以下方法:

方法#1:

private void copyFile(File src, File dst) throws IOException {

    File from = new File(src.getPath());
    File to = new File(dst.getPath());
    from.renameTo(to);
}
Run Code Online (Sandbox Code Playgroud)

方法#2:

private void copyFile(File src, File dst) throws IOException {

    FileChannel inChannel = null;
    FileChannel outChannel = null;

    try {
        inChannel = new FileInputStream(src).getChannel();
        outChannel = new FileOutputStream(dst).getChannel();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    try {
        inChannel.transferTo(0, inChannel.size(), outChannel);
    } finally {
        if (inChannel != null)
            inChannel.close();
        if (outChannel != …
Run Code Online (Sandbox Code Playgroud)

java file-io android copy android-external-storage

6
推荐指数
2
解决办法
9560
查看次数

Android Studio - 提示打开任何可用应用程序的下载文件

我有一个应用程序,它使用Firebase从服务器接收URL.收到URL后,该URL上的文件将自动保存在本地存储中(它们是gpx文件).

但在此之后,我希望我的应用程序提示用户使用他们在手机上安装的任何导航应用程序打开下载的文件.类似于你自己去文件管理器时,点击一个文件,然后系统会显示所有可以打开该文件的应用程序,并让你选择(或者直接用你的默认设置打开它,如果你有的话).

我一直无法找到任何相关内容,包含"android studio"和"open file"的搜索主要显示有关如何自行管理源文件的教程,因此它们根本没用.

android-external-storage android-studio

6
推荐指数
1
解决办法
174
查看次数

Android Oreo(API 26) - 在外部存储中创建目录

我一直在nougat上开发一个应用程序,它在外部存储中创建一个目录.

我过去常常这样做:

final File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Chords/Processed Audio");
dir.mkdirs();
Run Code Online (Sandbox Code Playgroud)

此代码似乎不适用于API 26(Android Oreo).目录未创建.

我怎样才能实现相同的功能,最好适用于从API 21到API 26的所有Android版本?

android android-external-storage android-8.0-oreo

6
推荐指数
1
解决办法
4729
查看次数

如何在Android中保存文件(图像)并支持API级别从21到29?

上传到 Google Play 的所有新应用都必须针对 Android 10(API 级别 29)或更高版本。Environment.getExternalStorageDirectory()但是,当应用程序以 API 级别 29 为目标时,应用程序将无法再直接访问从返回的路径。

文档建议使用Context.getExternalFilesDir()(不适合我的用例,因为放置在那里的文件位于应用程序内部,并且在卸载应用程序时被删除)或MediaStore,记录在此处

我陷入了以下片段:

// Find all image files on the primary external storage device.
// On API <= 28, use VOLUME_EXTERNAL instead.
Uri collection = MediaStore.Images.Media.getContentUri(
            MediaStore.VOLUME_EXTERNAL_PRIMARY);
Run Code Online (Sandbox Code Playgroud)

当我尝试支持 API <= 28 和 API >= 29 时,我尝试了以下操作:

    Uri collection;
    if (VERSION.SDK_INT >= VERSION_CODES.Q) {
        collection = MediaStore.Images.Media.getContentUri(
            MediaStore.VOLUME_EXTERNAL_PRIMARY);
    } else {
        collection = MediaStore.Images.Media.getContentUri(
            MediaStore.VOLUME_EXTERNAL);
    }
Run Code Online (Sandbox Code Playgroud)

但是,我仍然收到需要 API 级别 29 的警告。MediaStore.VOLUME_EXTERNAL …

media android android-external-storage android-storage

6
推荐指数
1
解决办法
1311
查看次数

将 Android 11 中的文件保存到外部存储(SDK 30)

我正在 Android 11(SDK 版本 30)上编写一个新应用程序,但我根本找不到有关如何将文件保存到外部存储的示例。

我阅读了他们的文档,现在知道他们基本上忽略了清单权限(READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE)。它们还会忽略android:requestLegacyExternalStorage="true"manifest.xml 应用程序标记中的 。

在他们的文档https://developer.android.com/about/versions/11/privacy/storage 中,他们写道您需要启用DEFAULT_SCOPED_STORAGEFORCE_ENABLE_SCOPED_STORAGE标志以在您的应用程序中启用范围存储。

我必须在哪里启用这些?当我完成此操作后,我如何以及何时获得写入外部存储的实际权限?有人可以提供工作代码吗?
我想保存 .gif、.png 和 .mp3 文件。所以我不想给画廊写信。

提前致谢。

permissions android file android-external-storage android-11

6
推荐指数
3
解决办法
8140
查看次数

在 Android 11 上将文件保存到 SD 卡上

我想将照片保存在 Android 11 上 SD 卡的外部应用程序目录中。执行此操作的正确方法是什么?我是否必须将 SAF API 与由操作 ACTION_OPEN_DOCUMENT_TREE 触发的系统选择器一起使用,其中用户必须选择 sd 卡上的文件夹?

或者也许我可以使用这个方法:

File[] externalStorageVolumes =ContextCompat.getExternalFilesDirs(mContext, null);
Run Code Online (Sandbox Code Playgroud)

并假设如果 SD 卡可用,它将打开externalStorageVolumes[1]?这适用于我的 2 台设备(搭载 Android 5 的三星 j1 和搭载 Android 10 的三星 s10),但我没有机会访问更多设备来测试它。

java android android-external-storage scoped-storage

6
推荐指数
1
解决办法
9462
查看次数

检查是否为另一个应用程序授予了外部存储管理器

我需要检查其他应用程序是否具有外部存储管理器的权限。和

Environment.isExternalStorageManager()
Run Code Online (Sandbox Code Playgroud)

我检查当前应用程序是否已被授予。我如何为另一个应用程序执行此操作?我已经尝试检查权限状态

getPackageManager().checkPermission(Manifest.permission.MANAGE_EXTERNAL_STORAGE, "dk.tacit.android.foldersync.lite")
Run Code Online (Sandbox Code Playgroud)

但它总是返回 -1,这意味着 PERMISSION_DENIED,即使授予了权限。

permissions android android-external-storage android-11

6
推荐指数
1
解决办法
848
查看次数

Android删除SQL数据库

我有一个奇怪的问题,当我卸载应用程序时,我的SQL数据库不会自行删除

我不是在任何外部存储目录中创建数据库,并且确认数据库位于其默认位置: /data/data/com.example.app/databases/

卸载应用程序后,我希望擦除该位置的所有数据,但是当我从android studio再次运行应用程序时,新安装仍然可以看到所有旧数据

我已经尝试使用adb手动删除.db数据库目录中的文件,但是当我再次运行应用程序时,仍然可以看到旧数据

我也尝试进入应用程序设置并清除数据和缓存,但这似乎没有帮助

在我的代码中,我对数据库做任何"奇怪"事情的唯一地方是我在按钮点击时将数据库文件复制到新位置:

String pathToExternalStorage = Environment.getExternalStorageDirectory().toString();
File exportDir = new File(pathToExternalStorage, "/SensorData");
File subjectDataDir = new File(exportDir, "/subjects");

File data = Environment.getDataDirectory();
String currentDBPath = "//data//com.example.app//databases//" + DBHelper.DATABASE_NAME;
File currentDB = new File(data, currentDBPath);
File destDB = new File(exportDir, DBHelper.DATABASE_NAME);

FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(destDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
Run Code Online (Sandbox Code Playgroud)

然后在新创建的文件上运行mediascanner,以便我可以立即获得MTP访问权限

我怀疑这些过程中的任何一个都可能导致这种情况发生吗?

我当前的问题是如何在没有root访问权限的情况下从手机中手动删除数据库?

更大的问题是什么可能导致卸载过程不删除数据库文件?新安装的应用程序版本(卸载后)如何仍然可以看到旧的数据库信息?

我不知道如何开始搞清楚这一点......

编辑:

这变得越来越陌生.这似乎只发生在Windows上.这是我尝试过的过程:

  1. 从手机中删除/卸载应用程序
  2. 在Windows上从android studio运行应用程序.问题:数据库仍然存在,应用程序看到所有旧数据(即使我卸载了应用程序)
  3. 卸载应用
  4. 在我的macbook上从android studio运行应用程序.没问题!数据库是新鲜的,没有找到现有数据
  5. 再次卸载应用程序
  6. 在我的Windows机器上再次测试.现在,数据库返回,应用程序看到旧的​​旧数据库信息(从第2步开始!).此时卸载并没有摆脱它

所以我现在真的很茫然.为什么在Mac上运行会好吗?为什么在Mac上运行并清理数据库后,再次带上旧的Windows数据库呢?这不是所有操作系统都独立吗?

database sqlite android android-sqlite android-external-storage

5
推荐指数
1
解决办法
2219
查看次数

如何读取外部存储android Q?

在 android Java 上工作,最近将 SDK 更新到 API 级别 29 现在有一个警告显示,指出

Environment.getExternalStorageDirectory() 在 API 级别 29 中已弃用

所以我们必须使用 getExternalFilesDir() 但返回这样的 /storage/emulated/0/Android/data/yourpacakgeName/files/Download/demoform1 (1).pdf

我想从下载电话中获取真实路径:/storage/emulated/0/Download

任何人都可以帮助阅读真实路径下载文件夹

java android android-external-storage android-10.0

5
推荐指数
0
解决办法
271
查看次数